Repository: digitalocean/doctl
Pull request #1620 (2024-11-27 14:38:03)

LBAAS: display LBs IPv6
- update godo version
- display lb ipv6


Patch:
diff --git a/commands/displayers/load_balancer.go b/commands/displayers/load_balancer.go
index 37524762..ccaf2b44 100644
--- a/commands/displayers/load_balancer.go
+++ b/commands/displayers/load_balancer.go
@@ -36,6 +36,7 @@ func (lb *LoadBalancer) Cols() []string {
 	return []string{
 		"ID",
 		"IP",
+		"IPv6",
 		"Name",
 		"Status",
 		"Created",
@@ -57,6 +58,7 @@ func (lb *LoadBalancer) ColMap() map[string]string {
 	return map[string]string{
 		"ID":                           "ID",
 		"IP":                           "IP",
+		"IPv6":                         "IPv6",
 		"Name":                         "Name",
 		"Status":                       "Status",
 		"Created":                      "Created At",
@@ -86,6 +88,7 @@ func (lb *LoadBalancer) KV() []map[string]any {
 		o := map[string]any{
 			"ID":                           l.ID,
 			"IP":                           l.IP,
+			"IPv6":                         l.IPv6,
 			"Name":                         l.Name,
 			"Status":                       l.Status,
 			"Created":                      l.Created,
diff --git a/go.mod b/go.mod
index cbc99b2f..3e210690 100644
--- a/go.mod
+++ b/go.mod
@@ -5,7 +5,7 @@ go 1.22
 require (
 	github.com/blang/semver v3.5.1+incompatible
 	github.com/creack/pty v1.1.21
-	github.com/digitalocean/godo v1.130.1-0.20241119155329-45ad288c38bd
+	github.com/digitalocean/godo v1.131.0
 	github.com/docker/cli v24.0.5+incompatible
 	github.com/docker/docker v25.0.6+incompatible
 	github.com/docker/docker-credential-helpers v0.7.0 // indirect
diff --git a/go.sum b/go.sum
index 987729c0..272988f4 100644
--- a/go.sum
+++ b/go.sum
@@ -93,6 +93,8 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1
 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/digitalocean/godo v1.130.1-0.20241119155329-45ad288c38bd h1:3TCd+SNAbaRHQSiWmMJWtPitvZt2lTq3th87CxMl9Xo=
 github.com/digitalocean/godo v1.130.1-0.20241119155329-45ad288c38bd/go.mod h1:PU8JB6I1XYkQIdHFop8lLAY9ojp6M0XcU0TWaQSxbrc=
+github.com/digitalocean/godo v1.131.0 h1:0WHymufAV5avpodT0h5/pucUVfO4v7biquOIqhLeROY=
+github.com/digitalocean/godo v1.131.0/go.mod h1:PU8JB6I1XYkQIdHFop8lLAY9ojp6M0XcU0TWaQSxbrc=
 github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
 github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
 github.com/docker/cli v24.0.5+incompatible h1:WeBimjvS0eKdH4Ygx+ihVq1Q++xg36M/rMi4aXAvodc=
diff --git a/vendor/github.com/digitalocean/godo/CHANGELOG.md b/vendor/github.com/digitalocean/godo/CHANGELOG.md
index 68e7d48f..3fb2a160 100644
--- a/vendor/github.com/digitalocean/godo/CHANGELOG.md
+++ b/vendor/github.com/digitalocean/godo/CHANGELOG.md
@@ -1,5 +1,13 @@
 # Change Log
 
+##  [v1.131.0] - 2024-11-25
+
+- #760 - @jvasilevsky - LBAAS: add ipv6 field to loadbalancer model
+- #759 - @imaskm - Add reserved ipv6 changes as Beta
+- #758 - @dvigueras - Add Rules field to create Databases with Firewall Rules
+- #751 - @blesswinsamuel - APPS-9766 Add method to restart apps
+
+
 ## [v1.130.0] - 2024-11-14
 
 - #755 - @vsharma6855  - Add Missing Database Configs for Postgresql and MYSQL
diff --git a/vendor/github.com/digitalocean/godo/databases.go b/vendor/github.com/digitalocean/godo/databases.go
index e2a7d567..1217ef05 100644
--- a/vendor/github.com/digitalocean/godo/databases.go
+++ b/vendor/github.com/digitalocean/godo/databases.go
@@ -299,19 +299,27 @@ type DatabaseBackupRestore struct {
 	BackupCreatedAt string `json:"backup_created_at,omitempty"`
 }
 
+// DatabaseCreateFirewallRule is a rule describing an inbound source to a database
+type DatabaseCreateFirewallRule struct {
+	UUID  string `json:"uuid"`
+	Type  string `json:"type"`
+	Value string `json:"value"`
+}
+
 // DatabaseCreateRequest represents a request to create a database cluster
 type DatabaseCreateRequest struct {
-	Name               string                 `json:"name,omitempty"`
-	EngineSlug         string                 `json:"engine,omitempty"`
-	Version            string                 `json:"version,omitempty"`
-	SizeSlug           string                 `json:"size,omitempty"`
-	Region             string                 `json:"region,omitempty"`
-	NumNodes           int                    `json:"num_nodes,omitempty"`
-	PrivateNetworkUUID string                 `json:"private_network_uuid"`
-	Tags               []string               `json:"tags,omitempty"`
-	BackupRestore      *DatabaseBackupRestore `json:"backup_restore,omitempty"`
-	ProjectID          string                 `json:"project_id"`
-	StorageSizeMib     uint64                 `json:"storage_size_mib,omitempty"`
+	Name               string                        `json:"name,omitempty"`
+	EngineSlug         string                        `json:"engine,omitempty"`
+	Version            string                        `json:"version,omitempty"`
+	SizeSlug           string                        `json:"size,omitempty"`
+	Region             string                        `json:"region,omitempty"`
+	NumNodes           int                           `json:"num_nodes,omitempty"`
+	PrivateNetworkUUID string                        `json:"private_network_uuid"`
+	Tags               []string                      `json:"tags,omitempty"`
+	BackupRestore      *DatabaseBackupRestore        `json:"backup_restore,omitempty"`
+	ProjectID          string                        `json:"project_id"`
+	StorageSizeMib     uint64                        `json:"storage_size_mib,omitempty"`
+	Rules              []*DatabaseCreateFirewallRule `json:"rules"`
 }
 
 // DatabaseResizeRequest can be used to initiate a database resize operation.
diff --git a/vendor/github.com/digitalocean/godo/godo.go b/vendor/github.com/digitalocean/godo/godo.go
index 4b9ad6b6..62498fc4 100644
--- a/vendor/github.com/digitalocean/godo/godo.go
+++ b/vendor/github.com/digitalocean/godo/godo.go
@@ -21,7 +21,7 @@ import (
 )
 
 const (
-	libraryVersion = "1.130.0"
+	libraryVersion = "1.131.0"
 	defaultBaseURL = "https://api.digitalocean.com/"
 	userAgent      = "godo/" + libraryVersion
 	mediaType      = "application/json"
@@ -54,43 +54,45 @@ type Client struct {
 	ratemtx sync.Mutex
 
 	// Services used for communicating with the API
-	Account           AccountService
-	Actions           ActionsService
-	Apps              AppsService
-	Balance           BalanceService
-	BillingHistory    BillingHistoryService
-	CDNs              CDNService
-	Certificates      CertificatesService
-	Databases         DatabasesService
-	Domains           DomainsService
-	Droplets          DropletsService
-	DropletActions    DropletActionsService
-	DropletAutoscale  DropletAutoscaleService
-	Firewalls         FirewallsService
-	FloatingIPs       FloatingIPsService
-	FloatingIPActions FloatingIPActionsService
-	Functions         FunctionsService
-	Images            ImagesService
-	ImageActions      ImageActionsService
-	Invoices          InvoicesService
-	Keys              KeysService
-	Kubernetes        KubernetesService
-	LoadBalancers     LoadBalancersService
-	Monitoring        MonitoringService
-	OneClick          OneClickService
-	Projects          ProjectsService
-	Regions           RegionsService
-	Registry          RegistryService
-	Registries        RegistriesService
-	ReservedIPs       ReservedIPsService
-	ReservedIPActions ReservedIPActionsService
-	Sizes             SizesService
-	Snapshots         SnapshotsService
-	Storage           StorageService
-	StorageActions    StorageActionsService
-	Tags              TagsService
-	UptimeChecks      UptimeChecksService
-	VPCs              VPCsService
+	Account             AccountService
+	Actions             ActionsService
+	Apps                AppsService
+	Balance             BalanceService
+	BillingHistory      BillingHistoryService
+	CDNs                CDNService
+	Certificates        CertificatesService
+	Databases           DatabasesService
+	Domains             DomainsService
+	Droplets            DropletsService
+	DropletActions      DropletActionsService
+	DropletAutoscale    DropletAutoscaleService
+	Firewalls           FirewallsService
+	FloatingIPs         FloatingIPsService
+	FloatingIPActions   FloatingIPActionsService
+	Functions           FunctionsService
+	Images              ImagesService
+	ImageActions        ImageActionsService
+	Invoices            InvoicesService
+	Keys                KeysService
+	Kubernetes          KubernetesService
+	LoadBalancers       LoadBalancersService
+	Monitoring          MonitoringService
+	OneClick            OneClickService
+	Projects            ProjectsService
+	Regions             RegionsService
+	Registry            RegistryService
+	Registries          RegistriesService
+	ReservedIPs         ReservedIPsService
+	ReservedIPV6s       ReservedIPV6sService
+	ReservedIPActions   ReservedIPActionsService
+	ReservedIPV6Actions ReservedIPV6ActionsService
+	Sizes               SizesService
+	Snapshots           SnapshotsService
+	Storage             StorageService
+	StorageActions      StorageActionsService
+	Tags                TagsService
+	UptimeChecks        UptimeChecksService
+	VPCs                VPCsService
 
 	// Optional function called after every successful request made to the DO APIs
 	onRequestCompleted RequestCompletionCallback
@@ -295,7 +297,9 @@ func NewClient(httpClient *http.Client) *Client {
 	c.Registry = &RegistryServiceOp{client: c}
 	c.Registries = &RegistriesServiceOp{client: c}
 	c.ReservedIPs = &ReservedIPsServiceOp{client: c}
+	c.ReservedIPV6s = &ReservedIPV6sServiceOp{client: c}
 	c.ReservedIPActions = &ReservedIPActionsServiceOp{client: c}
+	c.ReservedIPV6Actions = &ReservedIPV6ActionsServiceOp{client: c}
 	c.Sizes = &SizesServiceOp{client: c}
 	c.Snapshots = &SnapshotsServiceOp{client: c}
 	c.Storage = &StorageServiceOp{client: c}
diff --git a/vendor/github.com/digitalocean/godo/load_balancers.go b/vendor/github.com/digitalocean/godo/load_balancers.go
index a24952b7..a12729dd 100644
--- a/vendor/github.com/digitalocean/godo/load_balancers.go
+++ b/vendor/github.com/digitalocean/godo/load_balancers.go
@@ -45,6 +45,7 @@ type LoadBalancer struct {
 	ID   string `json:"id,omitempty"`
 	Name string `json:"name,omitempty"`
 	IP   string `json:"ip,omitempty"`
+	IPv6 string `json:"ipv6,omitempty"`
 	// SizeSlug is mutually exclusive with SizeUnit. Only one should be specified
 	SizeSlug string `json:"size,omitempty"`
 	// SizeUnit is mutually exclusive with SizeSlug. Only one should be specified
diff --git a/vendor/github.com/digitalocean/godo/reserved_ipv6.go b/vendor/github.com/digitalocean/godo/reserved_ipv6.go
new file mode 100644
index 00000000..aa265635
--- /dev/null
+++ b/vendor/github.com/digitalocean/godo/reserved_ipv6.go
@@ -0,0 +1,132 @@
+package godo
+
+import (
+	"context"
+	"fmt"
+	"net/http"
+	"time"
+)
+
+const resourceV6Type = "ReservedIPv6"
+const reservedIPV6sBasePath = "v2/reserved_ipv6"
+
+// ReservedIPV6sService is an interface for interfacing with the reserved IPV6s
+// endpoints of the Digital Ocean API.
+type ReservedIPV6sService interface {
+	List(context.Context, *ListOptions) ([]ReservedIPV6, *Response, error)
+	Get(context.Context, string) (*ReservedIPV6, *Response, error)
+	Create(context.Context, *ReservedIPV6CreateRequest) (*ReservedIPV6, *Response, error)
+	Delete(context.Context, string) (*Response, error)
+}
+
+// ReservedIPV6sServiceOp handles communication with the reserved IPs related methods of the
+// DigitalOcean API.
+type ReservedIPV6sServiceOp struct {
+	client *Client
+}
+
+var _ ReservedIPV6sService = (*ReservedIPV6sServiceOp)(nil)
+
+// ReservedIPV6 represents a Digital Ocean reserved IP.
+type ReservedIPV6 struct {
+	RegionSlug string    `json:"region_slug"`
+	IP         string    `json:"ip"`
+	ReservedAt time.Time `json:"reserved_at"`
+	Droplet    *Droplet  `json:"droplet,omitempty"`
+}
+
+func (f ReservedIPV6) String() string {
+	return Stringify(f)
+}
+
+// URN returns the reserved IP in a valid DO API URN form.
+func (f ReservedIPV6) URN() string {
+	return ToURN(resourceV6Type, f.IP)
+}
+
+type reservedIPV6sRoot struct {
+	ReservedIPs []ReservedIPV6 `json:"reserved_ips"`
+	Links       *Links         `json:"links"`
+	Meta        *Meta          `json:"meta"`
+}
+
+// ReservedIPV6CreateRequest represents a request to reserve a reserved IP.
+type ReservedIPV6CreateRequest struct {
+	Region string `json:"region_slug,omitempty"`
+}
+
+// List all reserved IPV6s.
+func (r *ReservedIPV6sServiceOp) List(ctx context.Context, opt *ListOptions) ([]ReservedIPV6, *Response, error) {
+	path := reservedIPV6sBasePath
+	path, err := addOptions(path, opt)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	req, err := r.client.NewRequest(ctx, http.MethodGet, path, nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	root := new(reservedIPV6sRoot)
+	resp, err := r.client.Do(ctx, req, root)
+	if err != nil {
+		return nil, nil, err
+	}
+	if l := root.Links; l != nil {
+		resp.Links = l
+	}
+	if m := root.Meta; m != nil {
+		resp.Meta = m
+	}
+
+	return root.ReservedIPs, resp, err
+}
+
+// Get an individual reserved IPv6.
+func (r *ReservedIPV6sServiceOp) Get(ctx context.Context, ip string) (*ReservedIPV6, *Response, error) {
+	path := fmt.Sprintf("%s/%s", reservedIPV6sBasePath, ip)
+
+	req, err := r.client.NewRequest(ctx, http.MethodGet, path, nil)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	root := new(ReservedIPV6)
+	resp, err := r.client.Do(ctx, req, root)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return root, resp, err
+}
+
+// Create a new IPv6
+func (r *ReservedIPV6sServiceOp) Create(ctx context.Context, reserveRequest *ReservedIPV6CreateRequest) (*ReservedIPV6, *Response, error) {
+	path := reservedIPV6sBasePath
+
+	req, err := r.client.NewRequest(ctx, http.MethodPost, path, reserveRequest)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	root := new(ReservedIPV6)
+	resp, err := r.client.Do(ctx, req, root)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return root, resp, err
+}
+
+// Delete a reserved IPv6.
+func (r *ReservedIPV6sServiceOp) Delete(ctx context.Context, ip string) (*Response, error) {
+	path := fmt.Sprintf("%s/%s", reservedIPV6sBasePath, ip)
+
+	req, err := r.client.NewRequest(ctx, http.MethodDelete, path, nil)
+	if err != nil {
+		return nil, err
+	}
+
+	return r.client.Do(ctx, req, nil)
+}
diff --git a/vendor/github.com/digitalocean/godo/reserved_ipv6_actions.go b/vendor/github.com/digitalocean/godo/reserved_ipv6_actions.go
new file mode 100644
index 00000000..dd14bc58
--- /dev/null
+++ b/vendor/github.com/digitalocean/godo/reserved_ipv6_actions.go
@@ -0,0 +1,57 @@
+package godo
+
+import (
+	"context"
+	"fmt"
+	"net/http"
+)
+
+// ReservedIPActionsService is an interface for interfacing with the
+// reserved IPs actions endpoints of the Digital Ocean API.
+// See: https://docs.digitalocean.com/reference/api/api-reference/#tag/Reserved-IP-Actions
+type ReservedIPV6ActionsService interface {
+	Assign(ctx context.Context, ip string, dropletID int) (*Action, *Response, error)
+	Unassign(ctx context.Context, ip string) (*Action, *Response, error)
+}
+
+// ReservedIPActionsServiceOp handles communication with the reserved IPs
+// action related methods of the DigitalOcean API.
+type ReservedIPV6ActionsServiceOp struct {
+	client *Client
+}
+
+// Assign a reserved IP to a droplet.
+func (s *ReservedIPV6ActionsServiceOp) Assign(ctx context.Context, ip string, dropletID int) (*Action, *Response, error) {
+	request := &ActionRequest{
+		"type":       "assign",
+		"droplet_id": dropletID,
+	}
+	return s.doV6Action(ctx, ip, request)
+}
+
+// Unassign a rerserved IP from the droplet it is currently assigned to.
+func (s *ReservedIPV6ActionsServiceOp) Unassign(ctx context.Context, ip string) (*Action, *Response, error) {
+	request := &ActionRequest{"type": "unassign"}
+	return s.doV6Action(ctx, ip, request)
+}
+
+func (s *ReservedIPV6ActionsServiceOp) doV6Action(ctx context.Context, ip string, request *ActionRequest) (*Action, *Response, error) {
+	path := reservedIPV6ActionPath(ip)
+
+	req, err := s.client.NewRequest(ctx, http.MethodPost, path, request)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	root := new(actionRoot)
+	resp, err := s.client.Do(ctx, req, root)
+	if err != nil {
+		return nil, resp, err
+	}
+
+	return root.Event, resp, err
+}
+
+func reservedIPV6ActionPath(ip string) string {
+	return fmt.Sprintf("%s/%s/actions", reservedIPV6sBasePath, ip)
+}
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 98a5ad39..4887d98e 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -61,7 +61,7 @@ github.com/creack/pty
 # github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc
 ## explicit
 github.com/davecgh/go-spew/spew
-# github.com/digitalocean/godo v1.130.1-0.20241119155329-45ad288c38bd
+# github.com/digitalocean/godo v1.131.0
 ## explicit; go 1.22
 github.com/digitalocean/godo
 github.com/digitalocean/godo/metrics


Test patch:
diff --git a/integration/glb_create_test.go b/integration/glb_create_test.go
index 12d8411f..fc5e4994 100644
--- a/integration/glb_create_test.go
+++ b/integration/glb_create_test.go
@@ -178,7 +178,7 @@ const (
 }`
 	glbCreateOutput = `
 Notice: Load balancer created
-ID                                      IP    Name           Status    Created At              Region    Size        Size Unit    VPC UUID    Tag    Droplet IDs    SSL      Sticky Sessions                                Health Check                                                                                                                                        Forwarding Rules    Disable Lets Encrypt DNS Records
-cf9f1aa1-e1f8-4f3a-ad71-124c45e204b8          my-glb-name    new       2024-04-09T16:10:11Z    <nil>     lb-small    1                                              false    type:none,cookie_name:,cookie_ttl_seconds:0    protocol:http,port:80,path:/,check_interval_seconds:10,response_timeout_seconds:5,healthy_threshold:5,unhealthy_threshold:3,proxy_protocol:<nil>                        false
+ID                                      IP    IPv6    Name           Status    Created At              Region    Size        Size Unit    VPC UUID    Tag    Droplet IDs    SSL      Sticky Sessions                                Health Check                                                                                                                                        Forwarding Rules    Disable Lets Encrypt DNS Records
+cf9f1aa1-e1f8-4f3a-ad71-124c45e204b8                  my-glb-name    new       2024-04-09T16:10:11Z    <nil>     lb-small    1                                              false    type:none,cookie_name:,cookie_ttl_seconds:0    protocol:http,port:80,path:/,check_interval_seconds:10,response_timeout_seconds:5,healthy_threshold:5,unhealthy_threshold:3,proxy_protocol:<nil>                        false
 `
 )
diff --git a/integration/glb_update_test.go b/integration/glb_update_test.go
index 429bf39e..21b04852 100644
--- a/integration/glb_update_test.go
+++ b/integration/glb_update_test.go
@@ -174,6 +174,6 @@ const (
   }
 }`
 	glbUpdateOutput = `
-ID               IP    Name           Status    Created At              Region    Size        Size Unit    VPC UUID    Tag    Droplet IDs    SSL      Sticky Sessions                                Health Check                                                                                                                                        Forwarding Rules    Disable Lets Encrypt DNS Records
-updated-lb-id          my-glb-name    new       2024-04-09T16:10:11Z    <nil>     lb-small    1                                              false    type:none,cookie_name:,cookie_ttl_seconds:0    protocol:http,port:80,path:/,check_interval_seconds:10,response_timeout_seconds:5,healthy_threshold:5,unhealthy_threshold:3,proxy_protocol:<nil>                        false`
+ID               IP    IPv6    Name           Status    Created At              Region    Size        Size Unit    VPC UUID    Tag    Droplet IDs    SSL      Sticky Sessions                                Health Check                                                                                                                                        Forwarding Rules    Disable Lets Encrypt DNS Records
+updated-lb-id                  my-glb-name    new       2024-04-09T16:10:11Z    <nil>     lb-small    1                                              false    type:none,cookie_name:,cookie_ttl_seconds:0    protocol:http,port:80,path:/,check_interval_seconds:10,response_timeout_seconds:5,healthy_threshold:5,unhealthy_threshold:3,proxy_protocol:<nil>                        false`
 )
diff --git a/integration/lb_create_test.go b/integration/lb_create_test.go
index b2dcd117..ddacf820 100644
--- a/integration/lb_create_test.go
+++ b/integration/lb_create_test.go
@@ -127,15 +127,15 @@ var _ = suite("compute/load-balancer/create", func(t *testing.T, when spec.G, it
 const (
 	lbCreateOutput = `
 Notice: Load balancer created
-ID                                      IP    Name             Status    Created At              Region    Size        Size Unit    VPC UUID                                Tag    Droplet IDs        SSL     Sticky Sessions                                Health Check                                                                                                                                 Forwarding Rules    Disable Lets Encrypt DNS Records
-4de7ac8b-495b-4884-9a69-1050c6793cd6          example-lb-01    new       2017-02-01T22:22:58Z    nyc3      lb-small    <nil>        00000000-0000-4000-8000-000000000000           3164444,3164445    true    type:none,cookie_name:,cookie_ttl_seconds:0    protocol:,port:0,path:,check_interval_seconds:0,response_timeout_seconds:0,healthy_threshold:0,unhealthy_threshold:0,proxy_protocol:<nil>                        true
+ID                                      IP    IPv6    Name             Status    Created At              Region    Size        Size Unit    VPC UUID                                Tag    Droplet IDs        SSL     Sticky Sessions                                Health Check                                                                                                                                 Forwarding Rules    Disable Lets Encrypt DNS Records
+4de7ac8b-495b-4884-9a69-1050c6793cd6                  example-lb-01    new       2017-02-01T22:22:58Z    nyc3      lb-small    <nil>        00000000-0000-4000-8000-000000000000           3164444,3164445    true    type:none,cookie_name:,cookie_ttl_seconds:0    protocol:,port:0,path:,check_interval_seconds:0,response_timeout_seconds:0,healthy_threshold:0,unhealthy_threshold:0,proxy_protocol:<nil>                        true
 `
 
 	lbWaitCreateOutput = `
 Notice: Load balancer creation is in progress, waiting for load balancer to become active
 Notice: Load balancer created
-ID                                      IP    Name             Status    Created At              Region    Size        Size Unit    VPC UUID                                Tag    Droplet IDs        SSL     Sticky Sessions                                Health Check                                                                                                                                 Forwarding Rules    Disable Lets Encrypt DNS Records
-4de7ac8b-495b-4884-9a69-1050c6793cd6          example-lb-01    active    2017-02-01T22:22:58Z    nyc3      lb-small    <nil>        00000000-0000-4000-8000-000000000000           3164444,3164445    true    type:none,cookie_name:,cookie_ttl_seconds:0    protocol:,port:0,path:,check_interval_seconds:0,response_timeout_seconds:0,healthy_threshold:0,unhealthy_threshold:0,proxy_protocol:<nil>                        true
+ID                                      IP    IPv6    Name             Status    Created At              Region    Size        Size Unit    VPC UUID                                Tag    Droplet IDs        SSL     Sticky Sessions                                Health Check                                                                                                                                 Forwarding Rules    Disable Lets Encrypt DNS Records
+4de7ac8b-495b-4884-9a69-1050c6793cd6                  example-lb-01    active    2017-02-01T22:22:58Z    nyc3      lb-small    <nil>        00000000-0000-4000-8000-000000000000           3164444,3164445    true    type:none,cookie_name:,cookie_ttl_seconds:0    protocol:,port:0,path:,check_interval_seconds:0,response_timeout_seconds:0,healthy_threshold:0,unhealthy_threshold:0,proxy_protocol:<nil>                        true
 `
 
 	lbCreateResponse = `
@@ -144,6 +144,7 @@ ID                                      IP    Name             Status    Created
     "id": "4de7ac8b-495b-4884-9a69-1050c6793cd6",
     "name": "example-lb-01",
     "ip": "",
+	"ipv6": "",
     "algorithm": "round_robin",
     "status": "new",
     "created_at": "2017-02-01T22:22:58Z",
diff --git a/integration/lb_get_test.go b/integration/lb_get_test.go
index 9bdae84a..73c00115 100644
--- a/integration/lb_get_test.go
+++ b/integration/lb_get_test.go
@@ -86,8 +86,8 @@ var _ = suite("compute/load-balancer/get", func(t *testing.T, when spec.G, it sp
 
 const (
 	lbGetOutput = `
-ID            IP                 Name             Status    Created At              Region    Size        Size Unit    VPC UUID                                Tag    Droplet IDs    SSL      Sticky Sessions                                Health Check                                                                                                                                 Forwarding Rules    Disable Lets Encrypt DNS Records
-find-lb-id    104.131.186.241    example-lb-01    new       2017-02-01T22:22:58Z    nyc3      lb-small    <nil>        00000000-0000-4000-8000-000000000000           3164445        false    type:none,cookie_name:,cookie_ttl_seconds:0    protocol:,port:0,path:,check_interval_seconds:0,response_timeout_seconds:0,healthy_threshold:0,unhealthy_threshold:0,proxy_protocol:<nil>                        false
+ID            IP                 IPv6                   Name             Status    Created At              Region    Size        Size Unit    VPC UUID                                Tag    Droplet IDs    SSL      Sticky Sessions                                Health Check                                                                                                                                 Forwarding Rules    Disable Lets Encrypt DNS Records
+find-lb-id    104.131.186.241    2001:db8::1234:5678    example-lb-01    new       2017-02-01T22:22:58Z    nyc3      lb-small    <nil>        00000000-0000-4000-8000-000000000000           3164445        false    type:none,cookie_name:,cookie_ttl_seconds:0    protocol:,port:0,path:,check_interval_seconds:0,response_timeout_seconds:0,healthy_threshold:0,unhealthy_threshold:0,proxy_protocol:<nil>                        false
 `
 	lbGetResponse = `
 {
@@ -95,6 +95,7 @@ find-lb-id    104.131.186.241    example-lb-01    new       2017-02-01T22:22:58Z
     "id": "find-lb-id",
     "name": "example-lb-01",
     "ip": "104.131.186.241",
+	"ipv6": "2001:db8::1234:5678",
     "algorithm": "round_robin",
     "status": "new",
     "created_at": "2017-02-01T22:22:58Z",
diff --git a/integration/lb_list_test.go b/integration/lb_list_test.go
index 18469e02..c0239162 100644
--- a/integration/lb_list_test.go
+++ b/integration/lb_list_test.go
@@ -80,9 +80,9 @@ var _ = suite("compute/load-balancer/list", func(t *testing.T, when spec.G, it s
 
 const (
 	lbListOutput = `
-ID        IP                 Name             Status    Created At              Region    Size         Size Unit    VPC UUID                                Tag    Droplet IDs    SSL      Sticky Sessions                                Health Check                                                                                                                                        Forwarding Rules                                                                                               Disable Lets Encrypt DNS Records
-lb-one    104.131.186.241    example-lb-01    new       2017-02-01T22:22:58Z    venus3    lb-small     <nil>        00000000-0000-4000-8000-000000000000           3164444        false    type:none,cookie_name:,cookie_ttl_seconds:0    protocol:http,port:80,path:/,check_interval_seconds:10,response_timeout_seconds:5,healthy_threshold:5,unhealthy_threshold:3,proxy_protocol:<nil>    entry_protocol:http,entry_port:80,target_protocol:http,target_port:80,certificate_id:,tls_passthrough:false    true
-lb-two    104.131.188.204    example-lb-02    new       2017-02-01T20:44:58Z    mars1     lb-medium    <nil>        00000000-0000-4000-8000-000000000000           3164445        false    type:none,cookie_name:,cookie_ttl_seconds:0    protocol:http,port:80,path:/,check_interval_seconds:10,response_timeout_seconds:5,healthy_threshold:5,unhealthy_threshold:3,proxy_protocol:<nil>    entry_protocol:http,entry_port:80,target_protocol:http,target_port:80,certificate_id:,tls_passthrough:false    false
+ID        IP                 IPv6                   Name             Status    Created At              Region    Size         Size Unit    VPC UUID                                Tag    Droplet IDs    SSL      Sticky Sessions                                Health Check                                                                                                                                        Forwarding Rules                                                                                               Disable Lets Encrypt DNS Records
+lb-one    104.131.186.241    2001:db8::1234:5678    example-lb-01    new       2017-02-01T22:22:58Z    venus3    lb-small     <nil>        00000000-0000-4000-8000-000000000000           3164444        false    type:none,cookie_name:,cookie_ttl_seconds:0    protocol:http,port:80,path:/,check_interval_seconds:10,response_timeout_seconds:5,healthy_threshold:5,unhealthy_threshold:3,proxy_protocol:<nil>    entry_protocol:http,entry_port:80,target_protocol:http,target_port:80,certificate_id:,tls_passthrough:false    true
+lb-two    104.131.188.204    2001:db8::1234:5679    example-lb-02    new       2017-02-01T20:44:58Z    mars1     lb-medium    <nil>        00000000-0000-4000-8000-000000000000           3164445        false    type:none,cookie_name:,cookie_ttl_seconds:0    protocol:http,port:80,path:/,check_interval_seconds:10,response_timeout_seconds:5,healthy_threshold:5,unhealthy_threshold:3,proxy_protocol:<nil>    entry_protocol:http,entry_port:80,target_protocol:http,target_port:80,certificate_id:,tls_passthrough:false    false
 `
 	lbListResponse = `
 {
@@ -91,6 +91,7 @@ lb-two    104.131.188.204    example-lb-02    new       2017-02-01T20:44:58Z
       "id": "lb-one",
       "name": "example-lb-01",
       "ip": "104.131.186.241",
+      "ipv6": "2001:db8::1234:5678",
       "algorithm": "round_robin",
       "status": "new",
       "created_at": "2017-02-01T22:22:58Z",
@@ -135,6 +136,7 @@ lb-two    104.131.188.204    example-lb-02    new       2017-02-01T20:44:58Z
       "id": "lb-two",
       "name": "example-lb-02",
       "ip": "104.131.188.204",
+      "ipv6": "2001:db8::1234:5679",
       "algorithm": "round_robin",
       "status": "new",
       "created_at": "2017-02-01T20:44:58Z",
diff --git a/integration/projects_resources_get_test.go b/integration/projects_resources_get_test.go
index 84db1f1b..f8e221fe 100644
--- a/integration/projects_resources_get_test.go
+++ b/integration/projects_resources_get_test.go
@@ -261,8 +261,8 @@ IP             Region    Droplet ID    Droplet Name    Project ID
 }
 `
 	projectsResourcesGetLoadbalancerOutput = `
-ID                                      IP                 Name             Status    Created At              Region    Size        Size Unit    VPC UUID                                Tag    Droplet IDs    SSL      Sticky Sessions                                Health Check                                                                                                                                 Forwarding Rules                                                                                                  Disable Lets Encrypt DNS Records
-4de7ac8b-495b-4884-9a69-1050c6793cd6    104.131.186.241    example-lb-01    new       2017-02-01T22:22:58Z    nyc3      lb-small    <nil>        00000000-0000-4000-8000-000000000000           3164445        false    type:none,cookie_name:,cookie_ttl_seconds:0    protocol:,port:0,path:,check_interval_seconds:0,response_timeout_seconds:0,healthy_threshold:0,unhealthy_threshold:0,proxy_protocol:<nil>    entry_protocol:https,entry_port:444,target_protocol:https,target_port:443,certificate_id:,tls_passthrough:true    false
+ID                                      IP                 IPv6    Name             Status    Created At              Region    Size        Size Unit    VPC UUID                                Tag    Droplet IDs    SSL      Sticky Sessions                                Health Check                                                                                                                                 Forwarding Rules                                                                                                  Disable Lets Encrypt DNS Records
+4de7ac8b-495b-4884-9a69-1050c6793cd6    104.131.186.241            example-lb-01    new       2017-02-01T22:22:58Z    nyc3      lb-small    <nil>        00000000-0000-4000-8000-000000000000           3164445        false    type:none,cookie_name:,cookie_ttl_seconds:0    protocol:,port:0,path:,check_interval_seconds:0,response_timeout_seconds:0,healthy_threshold:0,unhealthy_threshold:0,proxy_protocol:<nil>    entry_protocol:https,entry_port:444,target_protocol:https,target_port:443,certificate_id:,tls_passthrough:true    false
 `
 	projectsResourcesGetLoadbalancerResponse = `
 {