From 9338200be9b991f2a7e5d461c3b744e0ef663316 Mon Sep 17 00:00:00 2001 From: Ashwani Date: Wed, 27 Nov 2024 12:20:10 +0530 Subject: [PATCH 1/4] updated list ipv6 response --- reserved_ipv6.go | 28 ++++++++++++++-------------- reserved_ipv6_test.go | 18 ++++++++++-------- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/reserved_ipv6.go b/reserved_ipv6.go index aa265635..3d016ce0 100644 --- a/reserved_ipv6.go +++ b/reserved_ipv6.go @@ -13,7 +13,7 @@ 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) + List(context.Context, *ListOptions) (*ReservedIPV6List, *Response, error) Get(context.Context, string) (*ReservedIPV6, *Response, error) Create(context.Context, *ReservedIPV6CreateRequest) (*ReservedIPV6, *Response, error) Delete(context.Context, string) (*Response, error) @@ -35,6 +35,12 @@ type ReservedIPV6 struct { Droplet *Droplet `json:"droplet,omitempty"` } +type ReservedIPV6List struct { + ReservedIPV6s []ReservedIPV6 `json:"reserved_ipv6s"` + Links *Links `json:"links"` + Meta *Meta `json:"meta"` +} + func (f ReservedIPV6) String() string { return Stringify(f) } @@ -44,19 +50,13 @@ 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) { +func (r *ReservedIPV6sServiceOp) List(ctx context.Context, opt *ListOptions) (*ReservedIPV6List, *Response, error) { path := reservedIPV6sBasePath path, err := addOptions(path, opt) if err != nil { @@ -68,19 +68,19 @@ func (r *ReservedIPV6sServiceOp) List(ctx context.Context, opt *ListOptions) ([] return nil, nil, err } - root := new(reservedIPV6sRoot) + root := new(ReservedIPV6List) 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 root.Meta != nil { + resp.Meta = root.Meta } - if m := root.Meta; m != nil { - resp.Meta = m + if root.Links != nil { + resp.Links = root.Links } - return root.ReservedIPs, resp, err + return root, resp, err } // Get an individual reserved IPv6. diff --git a/reserved_ipv6_test.go b/reserved_ipv6_test.go index a7351690..73410bbf 100644 --- a/reserved_ipv6_test.go +++ b/reserved_ipv6_test.go @@ -58,11 +58,11 @@ func TestReservedIPV6s_List(t *testing.T) { mux.HandleFunc("/v2/reserved_ipv6", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, http.MethodGet) - fmt.Fprint(w, `{"reserved_ips": [ + fmt.Fprint(w, `{"reserved_ipv6s": [ {"region_slug":"nyc3","droplet":{"id":1},"ip":"2604:a880:800:14::42c3:d000"}, {"region_slug":"nyc3","droplet":{"id":2},"ip":"2604:a880:800:14::42c3:d001"} ], - "meta":{"total":2} + "meta": {"total": 2} }`) }) @@ -71,11 +71,13 @@ func TestReservedIPV6s_List(t *testing.T) { t.Errorf("ReservedIPs.List returned error: %v", err) } - expectedReservedIPs := []ReservedIPV6{ - {RegionSlug: "nyc3", Droplet: &Droplet{ID: 1}, IP: "2604:a880:800:14::42c3:d000"}, - {RegionSlug: "nyc3", Droplet: &Droplet{ID: 2}, IP: "2604:a880:800:14::42c3:d001"}, + expectedReservedIPs := ReservedIPV6List{ + ReservedIPV6s: []ReservedIPV6{ + {RegionSlug: "nyc3", Droplet: &Droplet{ID: 1}, IP: "2604:a880:800:14::42c3:d000"}, + {RegionSlug: "nyc3", Droplet: &Droplet{ID: 2}, IP: "2604:a880:800:14::42c3:d001"}, + }, } - if !reflect.DeepEqual(reservedIPs, expectedReservedIPs) { + if !reflect.DeepEqual(reservedIPs.ReservedIPV6s, expectedReservedIPs.ReservedIPV6s) { t.Errorf("ReservedIPV6s.List returned reserved IPs %+v, expected %+v", reservedIPs, expectedReservedIPs) } @@ -83,7 +85,7 @@ func TestReservedIPV6s_List(t *testing.T) { Total: 2, } if !reflect.DeepEqual(resp.Meta, expectedMeta) { - t.Errorf("ReservedIPs.List returned meta %+v, expected %+v", resp.Meta, expectedMeta) + t.Errorf("ReservedIPV6s.List returned meta %+v, expected %+v", resp.Meta, expectedMeta) } } @@ -93,7 +95,7 @@ func TestReservedIPV6s_ListReservedIPsMultiplePages(t *testing.T) { mux.HandleFunc("/v2/reserved_ipv6", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, http.MethodGet) - fmt.Fprint(w, `{"reserved_ips": [ + fmt.Fprint(w, `{"reserved_ipv6s": [ {"region_slug":"nyc3","droplet":{"id":1},"ip":"2604:a880:800:14::42c3:d001"}, {"region":{"slug":"nyc3"},"droplet":{"id":2},"ip":"2604:a880:800:14::42c3:d002"}], "links":{"pages":{"next":"http://example.com/v2/reserved_ipv6/?page=2"}}} From 35b3a27f4b4d667f1b942cc7f14b1214c94baba7 Mon Sep 17 00:00:00 2001 From: Ashwani Date: Wed, 27 Nov 2024 22:12:54 +0530 Subject: [PATCH 2/4] updated create/get response --- reserved_ipv6.go | 15 +++++++++------ reserved_ipv6_test.go | 14 +++++++------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/reserved_ipv6.go b/reserved_ipv6.go index 3d016ce0..6981d13c 100644 --- a/reserved_ipv6.go +++ b/reserved_ipv6.go @@ -14,8 +14,8 @@ const reservedIPV6sBasePath = "v2/reserved_ipv6" // endpoints of the Digital Ocean API. type ReservedIPV6sService interface { List(context.Context, *ListOptions) (*ReservedIPV6List, *Response, error) - Get(context.Context, string) (*ReservedIPV6, *Response, error) - Create(context.Context, *ReservedIPV6CreateRequest) (*ReservedIPV6, *Response, error) + Get(context.Context, string) (*ReservedIPV6Resp, *Response, error) + Create(context.Context, *ReservedIPV6CreateRequest) (*ReservedIPV6Resp, *Response, error) Delete(context.Context, string) (*Response, error) } @@ -34,6 +34,9 @@ type ReservedIPV6 struct { ReservedAt time.Time `json:"reserved_at"` Droplet *Droplet `json:"droplet,omitempty"` } +type ReservedIPV6Resp struct { + ReservedIPV6 *ReservedIPV6 `json:"reserved_ipv6"` +} type ReservedIPV6List struct { ReservedIPV6s []ReservedIPV6 `json:"reserved_ipv6s"` @@ -84,7 +87,7 @@ func (r *ReservedIPV6sServiceOp) List(ctx context.Context, opt *ListOptions) (*R } // Get an individual reserved IPv6. -func (r *ReservedIPV6sServiceOp) Get(ctx context.Context, ip string) (*ReservedIPV6, *Response, error) { +func (r *ReservedIPV6sServiceOp) Get(ctx context.Context, ip string) (*ReservedIPV6Resp, *Response, error) { path := fmt.Sprintf("%s/%s", reservedIPV6sBasePath, ip) req, err := r.client.NewRequest(ctx, http.MethodGet, path, nil) @@ -92,7 +95,7 @@ func (r *ReservedIPV6sServiceOp) Get(ctx context.Context, ip string) (*ReservedI return nil, nil, err } - root := new(ReservedIPV6) + root := new(ReservedIPV6Resp) resp, err := r.client.Do(ctx, req, root) if err != nil { return nil, resp, err @@ -102,7 +105,7 @@ func (r *ReservedIPV6sServiceOp) Get(ctx context.Context, ip string) (*ReservedI } // Create a new IPv6 -func (r *ReservedIPV6sServiceOp) Create(ctx context.Context, reserveRequest *ReservedIPV6CreateRequest) (*ReservedIPV6, *Response, error) { +func (r *ReservedIPV6sServiceOp) Create(ctx context.Context, reserveRequest *ReservedIPV6CreateRequest) (*ReservedIPV6Resp, *Response, error) { path := reservedIPV6sBasePath req, err := r.client.NewRequest(ctx, http.MethodPost, path, reserveRequest) @@ -110,7 +113,7 @@ func (r *ReservedIPV6sServiceOp) Create(ctx context.Context, reserveRequest *Res return nil, nil, err } - root := new(ReservedIPV6) + root := new(ReservedIPV6Resp) resp, err := r.client.Do(ctx, req, root) if err != nil { return nil, resp, err diff --git a/reserved_ipv6_test.go b/reserved_ipv6_test.go index 73410bbf..a06f960b 100644 --- a/reserved_ipv6_test.go +++ b/reserved_ipv6_test.go @@ -30,7 +30,7 @@ func TestReservedIPV6s_Create(t *testing.T) { t.Errorf("Request body = %+v, expected %+v", v, reserveRequest) } - fmt.Fprint(w, `{"ip":"2604:a880:800:14::42c3:d000","region_slug":"nyc3","reserved_at":"`+nowTime.Format(time.RFC3339Nano)+`"}`) + fmt.Fprint(w, `{"reserved_ipv6":{"ip":"2604:a880:800:14::42c3:d000","region_slug":"nyc3","reserved_at":"`+nowTime.Format(time.RFC3339Nano)+`"}}`) }) reservedIP, _, err := client.ReservedIPV6s.Create(ctx, reserveRequest) @@ -38,10 +38,10 @@ func TestReservedIPV6s_Create(t *testing.T) { t.Errorf("ReservedIPV6s.Create returned error: %v", err) } - expected := &ReservedIPV6{RegionSlug: "nyc3", IP: "2604:a880:800:14::42c3:d000", ReservedAt: nowTime} + expected := &ReservedIPV6Resp{ReservedIPV6: &ReservedIPV6{RegionSlug: "nyc3", IP: "2604:a880:800:14::42c3:d000", ReservedAt: nowTime}} - if !equalReserveIPv6Objects(reservedIP, expected) { - t.Errorf("ReservedIPs.Create returned %+v, expected %+v", reservedIP, expected) + if !equalReserveIPv6Objects(reservedIP.ReservedIPV6, expected.ReservedIPV6) { + t.Errorf("ReservedIPV6s.Create returned %+v, expected %+v", reservedIP, expected) } } @@ -116,7 +116,7 @@ func TestReservedIPV6s_Get(t *testing.T) { nowTime := time.Now() mux.HandleFunc("/v2/reserved_ipv6/2604:a880:800:14::42c3:d001", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, http.MethodGet) - fmt.Fprint(w, `{"region_slug":"nyc3","droplet":{"id":1},"ip":"2604:a880:800:14::42c3:d001", "reserved_at":"`+nowTime.Format(time.RFC3339Nano)+`"}`) + fmt.Fprint(w, `{"reserved_ipv6":{"region_slug":"nyc3","droplet":{"id":1},"ip":"2604:a880:800:14::42c3:d001", "reserved_at":"`+nowTime.Format(time.RFC3339Nano)+`"}}`) }) reservedIP, _, err := client.ReservedIPV6s.Get(ctx, "2604:a880:800:14::42c3:d001") @@ -124,8 +124,8 @@ func TestReservedIPV6s_Get(t *testing.T) { t.Errorf("ReservedIPV6s.Get returned error: %v", err) } - expected := &ReservedIPV6{RegionSlug: "nyc3", Droplet: &Droplet{ID: 1}, IP: "2604:a880:800:14::42c3:d001", ReservedAt: nowTime} - if !equalReserveIPv6Objects(reservedIP, expected) { + expected := &ReservedIPV6Resp{ReservedIPV6: &ReservedIPV6{RegionSlug: "nyc3", Droplet: &Droplet{ID: 1}, IP: "2604:a880:800:14::42c3:d001", ReservedAt: nowTime}} + if !equalReserveIPv6Objects(reservedIP.ReservedIPV6, expected.ReservedIPV6) { t.Errorf("ReservedIPV6s.Get returned %+v, expected %+v", reservedIP, expected) } } From 96c363fb60e090960d6ed4de5b5494b0e04c1c63 Mon Sep 17 00:00:00 2001 From: Ashwani Date: Wed, 27 Nov 2024 22:52:47 +0530 Subject: [PATCH 3/4] updated List response --- reserved_ipv6.go | 6 +++--- reserved_ipv6_test.go | 11 +++++------ 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/reserved_ipv6.go b/reserved_ipv6.go index 6981d13c..5327df90 100644 --- a/reserved_ipv6.go +++ b/reserved_ipv6.go @@ -13,7 +13,7 @@ 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) (*ReservedIPV6List, *Response, error) + List(context.Context, *ListOptions) ([]ReservedIPV6, *Response, error) Get(context.Context, string) (*ReservedIPV6Resp, *Response, error) Create(context.Context, *ReservedIPV6CreateRequest) (*ReservedIPV6Resp, *Response, error) Delete(context.Context, string) (*Response, error) @@ -59,7 +59,7 @@ type ReservedIPV6CreateRequest struct { } // List all reserved IPV6s. -func (r *ReservedIPV6sServiceOp) List(ctx context.Context, opt *ListOptions) (*ReservedIPV6List, *Response, error) { +func (r *ReservedIPV6sServiceOp) List(ctx context.Context, opt *ListOptions) ([]ReservedIPV6, *Response, error) { path := reservedIPV6sBasePath path, err := addOptions(path, opt) if err != nil { @@ -83,7 +83,7 @@ func (r *ReservedIPV6sServiceOp) List(ctx context.Context, opt *ListOptions) (*R resp.Links = root.Links } - return root, resp, err + return root.ReservedIPV6s, resp, err } // Get an individual reserved IPv6. diff --git a/reserved_ipv6_test.go b/reserved_ipv6_test.go index a06f960b..bfeb241e 100644 --- a/reserved_ipv6_test.go +++ b/reserved_ipv6_test.go @@ -71,13 +71,12 @@ func TestReservedIPV6s_List(t *testing.T) { t.Errorf("ReservedIPs.List returned error: %v", err) } - expectedReservedIPs := ReservedIPV6List{ - ReservedIPV6s: []ReservedIPV6{ - {RegionSlug: "nyc3", Droplet: &Droplet{ID: 1}, IP: "2604:a880:800:14::42c3:d000"}, - {RegionSlug: "nyc3", Droplet: &Droplet{ID: 2}, IP: "2604:a880:800:14::42c3:d001"}, - }, + expectedReservedIPs := []ReservedIPV6{ + {RegionSlug: "nyc3", Droplet: &Droplet{ID: 1}, IP: "2604:a880:800:14::42c3:d000"}, + {RegionSlug: "nyc3", Droplet: &Droplet{ID: 2}, IP: "2604:a880:800:14::42c3:d001"}, } - if !reflect.DeepEqual(reservedIPs.ReservedIPV6s, expectedReservedIPs.ReservedIPV6s) { + + if !reflect.DeepEqual(reservedIPs, expectedReservedIPs) { t.Errorf("ReservedIPV6s.List returned reserved IPs %+v, expected %+v", reservedIPs, expectedReservedIPs) } From e81dfeb15ed0ea1fb40a378f0861794e9bf0aca0 Mon Sep 17 00:00:00 2001 From: Ashwani Date: Thu, 28 Nov 2024 00:20:39 +0530 Subject: [PATCH 4/4] addressed review comments --- reserved_ipv6.go | 22 +++++++++++----------- reserved_ipv6_test.go | 8 ++++---- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/reserved_ipv6.go b/reserved_ipv6.go index 5327df90..119c6bde 100644 --- a/reserved_ipv6.go +++ b/reserved_ipv6.go @@ -14,8 +14,8 @@ const reservedIPV6sBasePath = "v2/reserved_ipv6" // endpoints of the Digital Ocean API. type ReservedIPV6sService interface { List(context.Context, *ListOptions) ([]ReservedIPV6, *Response, error) - Get(context.Context, string) (*ReservedIPV6Resp, *Response, error) - Create(context.Context, *ReservedIPV6CreateRequest) (*ReservedIPV6Resp, *Response, error) + Get(context.Context, string) (*ReservedIPV6, *Response, error) + Create(context.Context, *ReservedIPV6CreateRequest) (*ReservedIPV6, *Response, error) Delete(context.Context, string) (*Response, error) } @@ -34,11 +34,11 @@ type ReservedIPV6 struct { ReservedAt time.Time `json:"reserved_at"` Droplet *Droplet `json:"droplet,omitempty"` } -type ReservedIPV6Resp struct { +type reservedIPV6Root struct { ReservedIPV6 *ReservedIPV6 `json:"reserved_ipv6"` } -type ReservedIPV6List struct { +type reservedIPV6sRoot struct { ReservedIPV6s []ReservedIPV6 `json:"reserved_ipv6s"` Links *Links `json:"links"` Meta *Meta `json:"meta"` @@ -71,7 +71,7 @@ func (r *ReservedIPV6sServiceOp) List(ctx context.Context, opt *ListOptions) ([] return nil, nil, err } - root := new(ReservedIPV6List) + root := new(reservedIPV6sRoot) resp, err := r.client.Do(ctx, req, root) if err != nil { return nil, nil, err @@ -87,7 +87,7 @@ func (r *ReservedIPV6sServiceOp) List(ctx context.Context, opt *ListOptions) ([] } // Get an individual reserved IPv6. -func (r *ReservedIPV6sServiceOp) Get(ctx context.Context, ip string) (*ReservedIPV6Resp, *Response, error) { +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) @@ -95,17 +95,17 @@ func (r *ReservedIPV6sServiceOp) Get(ctx context.Context, ip string) (*ReservedI return nil, nil, err } - root := new(ReservedIPV6Resp) + root := new(reservedIPV6Root) resp, err := r.client.Do(ctx, req, root) if err != nil { return nil, resp, err } - return root, resp, err + return root.ReservedIPV6, resp, err } // Create a new IPv6 -func (r *ReservedIPV6sServiceOp) Create(ctx context.Context, reserveRequest *ReservedIPV6CreateRequest) (*ReservedIPV6Resp, *Response, error) { +func (r *ReservedIPV6sServiceOp) Create(ctx context.Context, reserveRequest *ReservedIPV6CreateRequest) (*ReservedIPV6, *Response, error) { path := reservedIPV6sBasePath req, err := r.client.NewRequest(ctx, http.MethodPost, path, reserveRequest) @@ -113,13 +113,13 @@ func (r *ReservedIPV6sServiceOp) Create(ctx context.Context, reserveRequest *Res return nil, nil, err } - root := new(ReservedIPV6Resp) + root := new(reservedIPV6Root) resp, err := r.client.Do(ctx, req, root) if err != nil { return nil, resp, err } - return root, resp, err + return root.ReservedIPV6, resp, err } // Delete a reserved IPv6. diff --git a/reserved_ipv6_test.go b/reserved_ipv6_test.go index bfeb241e..d6f36f33 100644 --- a/reserved_ipv6_test.go +++ b/reserved_ipv6_test.go @@ -38,9 +38,9 @@ func TestReservedIPV6s_Create(t *testing.T) { t.Errorf("ReservedIPV6s.Create returned error: %v", err) } - expected := &ReservedIPV6Resp{ReservedIPV6: &ReservedIPV6{RegionSlug: "nyc3", IP: "2604:a880:800:14::42c3:d000", ReservedAt: nowTime}} + expected := &reservedIPV6Root{ReservedIPV6: &ReservedIPV6{RegionSlug: "nyc3", IP: "2604:a880:800:14::42c3:d000", ReservedAt: nowTime}} - if !equalReserveIPv6Objects(reservedIP.ReservedIPV6, expected.ReservedIPV6) { + if !equalReserveIPv6Objects(reservedIP, expected.ReservedIPV6) { t.Errorf("ReservedIPV6s.Create returned %+v, expected %+v", reservedIP, expected) } } @@ -123,8 +123,8 @@ func TestReservedIPV6s_Get(t *testing.T) { t.Errorf("ReservedIPV6s.Get returned error: %v", err) } - expected := &ReservedIPV6Resp{ReservedIPV6: &ReservedIPV6{RegionSlug: "nyc3", Droplet: &Droplet{ID: 1}, IP: "2604:a880:800:14::42c3:d001", ReservedAt: nowTime}} - if !equalReserveIPv6Objects(reservedIP.ReservedIPV6, expected.ReservedIPV6) { + expected := &reservedIPV6Root{ReservedIPV6: &ReservedIPV6{RegionSlug: "nyc3", Droplet: &Droplet{ID: 1}, IP: "2604:a880:800:14::42c3:d001", ReservedAt: nowTime}} + if !equalReserveIPv6Objects(reservedIP, expected.ReservedIPV6) { t.Errorf("ReservedIPV6s.Get returned %+v, expected %+v", reservedIP, expected) } }