From 10efe50338165e73cfc6b0a96a36701bc88118d0 Mon Sep 17 00:00:00 2001 From: Ezekiel Templin Date: Mon, 4 May 2020 12:43:36 -0700 Subject: [PATCH 1/3] Add Datadog logging endpoint support --- fastly/datadog.go | 232 +++++++++++++++++++++++ fastly/datadog_test.go | 263 +++++++++++++++++++++++++++ fastly/fixtures/datadog/create.yaml | 63 +++++++ fastly/fixtures/datadog/delete.yaml | 47 +++++ fastly/fixtures/datadog/get.yaml | 47 +++++ fastly/fixtures/datadog/list.yaml | 47 +++++ fastly/fixtures/datadog/update.yaml | 61 +++++++ fastly/fixtures/datadog/version.yaml | 51 ++++++ 8 files changed, 811 insertions(+) create mode 100644 fastly/datadog.go create mode 100644 fastly/datadog_test.go create mode 100644 fastly/fixtures/datadog/create.yaml create mode 100644 fastly/fixtures/datadog/delete.yaml create mode 100644 fastly/fixtures/datadog/get.yaml create mode 100644 fastly/fixtures/datadog/list.yaml create mode 100644 fastly/fixtures/datadog/update.yaml create mode 100644 fastly/fixtures/datadog/version.yaml diff --git a/fastly/datadog.go b/fastly/datadog.go new file mode 100644 index 000000000..59b0516ff --- /dev/null +++ b/fastly/datadog.go @@ -0,0 +1,232 @@ +package fastly + +import ( + "fmt" + "net/url" + "sort" + "time" +) + +// Datadog represents a datadog response from the Fastly API. +type Datadog struct { + ServiceID string `mapstructure:"service_id"` + Version int `mapstructure:"version"` + + Name string `mapstructure:"name"` + Token string `mapstructure:"token"` + Region string `mapstructure:"region"` + Format string `mapstructure:"format"` + FormatVersion uint `mapstructure:"format_version"` + ResponseCondition string `mapstructure:"response_condition"` + CreatedAt *time.Time `mapstructure:"created_at"` + UpdatedAt *time.Time `mapstructure:"updated_at"` + DeletedAt *time.Time `mapstructure:"deleted_at"` + Placement string `mapstructure:"placement"` +} + +// datadogByName is a sortable list of datadog. +type datadogByName []*Datadog + +// Len, Swap, and Less implement the sortable interface. +func (s datadogByName) Len() int { return len(s) } +func (s datadogByName) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s datadogByName) Less(i, j int) bool { + return s[i].Name < s[j].Name +} + +// ListDatadogInput is used as input to the ListDatadog function. +type ListDatadogInput struct { + // Service is the ID of the service (required). + Service string + + // Version is the specific configuration version (required). + Version int +} + +// ListDatadog returns the list of datadog for the configuration version. +func (c *Client) ListDatadog(i *ListDatadogInput) ([]*Datadog, error) { + if i.Service == "" { + return nil, ErrMissingService + } + + if i.Version == 0 { + return nil, ErrMissingVersion + } + + path := fmt.Sprintf("/service/%s/version/%d/logging/datadog", i.Service, i.Version) + resp, err := c.Get(path, nil) + if err != nil { + return nil, err + } + + var d []*Datadog + if err := decodeJSON(&d, resp.Body); err != nil { + return nil, err + } + sort.Stable(datadogByName(d)) + return d, nil +} + +// CreateDatadogInput is used as input to the CreateDatadog function. +type CreateDatadogInput struct { + // Service is the ID of the service. Version is the specific configuration + // version. Both fields are required. + Service string + Version int + + Name *string `form:"name,omitempty"` + Token *string `form:"token,omitempty"` + Region *string `form:"region,omitempty"` + Format *string `form:"format,omitempty"` + FormatVersion *uint `form:"format_version,omitempty"` + ResponseCondition *string `form:"response_condition,omitempty"` + Placement *string `form:"placement,omitempty"` +} + +// CreateDatadog creates a new Fastly datadog. +func (c *Client) CreateDatadog(i *CreateDatadogInput) (*Datadog, error) { + if i.Service == "" { + return nil, ErrMissingService + } + + if i.Version == 0 { + return nil, ErrMissingVersion + } + + path := fmt.Sprintf("/service/%s/version/%d/logging/datadog", i.Service, i.Version) + resp, err := c.PostForm(path, i, nil) + if err != nil { + return nil, err + } + + var d *Datadog + if err := decodeJSON(&d, resp.Body); err != nil { + return nil, err + } + return d, nil +} + +// GetDatadogInput is used as input to the GetDatadog function. +type GetDatadogInput struct { + // Service is the ID of the service. Version is the specific configuration + // version. Both fields are required. + Service string + Version int + + // Name is the name of the datadog to fetch. + Name string +} + +// GetDatadog gets the datadog configuration with the given parameters. +func (c *Client) GetDatadog(i *GetDatadogInput) (*Datadog, error) { + if i.Service == "" { + return nil, ErrMissingService + } + + if i.Version == 0 { + return nil, ErrMissingVersion + } + + if i.Name == "" { + return nil, ErrMissingName + } + + path := fmt.Sprintf("/service/%s/version/%d/logging/datadog/%s", i.Service, i.Version, url.PathEscape(i.Name)) + resp, err := c.Get(path, nil) + if err != nil { + return nil, err + } + + var d *Datadog + if err := decodeJSON(&d, resp.Body); err != nil { + return nil, err + } + return d, nil +} + +// UpdateDatadogInput is used as input to the UpdateDatadog function. +type UpdateDatadogInput struct { + // Service is the ID of the service. Version is the specific configuration + // version. Both fields are required. + Service string + Version int + + // Name is the name of the datadog to update. + Name string + + NewName *string `form:"name,omitempty"` + Token *string `form:"token,omitempty"` + Region *string `form:"region,omitempty"` + Format *string `form:"format,omitempty"` + FormatVersion *uint `form:"format_version,omitempty"` + ResponseCondition *string `form:"response_condition,omitempty"` + Placement *string `form:"placement,omitempty"` +} + +// UpdateDatadog updates a specific datadog. +func (c *Client) UpdateDatadog(i *UpdateDatadogInput) (*Datadog, error) { + if i.Service == "" { + return nil, ErrMissingService + } + + if i.Version == 0 { + return nil, ErrMissingVersion + } + + if i.Name == "" { + return nil, ErrMissingName + } + + path := fmt.Sprintf("/service/%s/version/%d/logging/datadog/%s", i.Service, i.Version, url.PathEscape(i.Name)) + resp, err := c.PutForm(path, i, nil) + if err != nil { + return nil, err + } + + var d *Datadog + if err := decodeJSON(&d, resp.Body); err != nil { + return nil, err + } + return d, nil +} + +// DeleteDatadogInput is the input parameter to DeleteDatadog. +type DeleteDatadogInput struct { + // Service is the ID of the service. Version is the specific configuration + // version. Both fields are required. + Service string + Version int + + // Name is the name of the datadog to delete (required). + Name string +} + +// DeleteDatadog deletes the given datadog version. +func (c *Client) DeleteDatadog(i *DeleteDatadogInput) error { + if i.Service == "" { + return ErrMissingService + } + + if i.Version == 0 { + return ErrMissingVersion + } + + if i.Name == "" { + return ErrMissingName + } + + path := fmt.Sprintf("/service/%s/version/%d/logging/datadog/%s", i.Service, i.Version, url.PathEscape(i.Name)) + resp, err := c.Delete(path, nil) + if err != nil { + return err + } + + var r *statusResp + if err := decodeJSON(&r, resp.Body); err != nil { + return err + } + if !r.Ok() { + return ErrStatusNotOk + } + return nil +} diff --git a/fastly/datadog_test.go b/fastly/datadog_test.go new file mode 100644 index 000000000..eade5cf20 --- /dev/null +++ b/fastly/datadog_test.go @@ -0,0 +1,263 @@ +package fastly + +import "testing" + +func TestClient_Datadog(t *testing.T) { + t.Parallel() + + var err error + var tv *Version + record(t, "datadog/version", func(c *Client) { + tv = testVersion(t, c) + }) + + // Create + var d *Datadog + record(t, "datadog/create", func(c *Client) { + d, err = c.CreateDatadog(&CreateDatadogInput{ + Service: testServiceID, + Version: tv.Number, + Name: String("test-datadog"), + Region: String("US"), + Token: String("abcd1234"), + Format: String("format"), + Placement: String("waf_debug"), + }) + }) + if err != nil { + t.Fatal(err) + } + + // Ensure deleted + defer func() { + record(t, "datadog/delete", func(c *Client) { + c.DeleteDatadog(&DeleteDatadogInput{ + Service: testServiceID, + Version: tv.Number, + Name: "test-datadog", + }) + + c.DeleteDatadog(&DeleteDatadogInput{ + Service: testServiceID, + Version: tv.Number, + Name: "new-test-datadog", + }) + }) + }() + + if d.Name != "test-datadog" { + t.Errorf("bad name: %q", d.Name) + } + if d.Token != "abcd1234" { + t.Errorf("bad token: %q", d.Token) + } + if d.Region != "US" { + t.Errorf("bad token: %q", d.Region) + } + if d.Format != "format" { + t.Errorf("bad format: %q", d.Format) + } + if d.FormatVersion != 2 { + t.Errorf("bad format_version: %q", d.FormatVersion) + } + if d.Placement != "waf_debug" { + t.Errorf("bad placement: %q", d.Placement) + } + + // List + var ld []*Datadog + record(t, "datadog/list", func(c *Client) { + ld, err = c.ListDatadog(&ListDatadogInput{ + Service: testServiceID, + Version: tv.Number, + }) + }) + if err != nil { + t.Fatal(err) + } + if len(ld) < 1 { + t.Errorf("bad datadogs: %v", ld) + } + + // Get + var nd *Datadog + record(t, "datadog/get", func(c *Client) { + nd, err = c.GetDatadog(&GetDatadogInput{ + Service: testServiceID, + Version: tv.Number, + Name: "test-datadog", + }) + }) + if err != nil { + t.Fatal(err) + } + if d.Name != nd.Name { + t.Errorf("bad name: %q", d.Name) + } + if d.Token != nd.Token { + t.Errorf("bad token: %q", d.Token) + } + if d.Format != nd.Format { + t.Errorf("bad format: %q", d.Format) + } + if d.FormatVersion != nd.FormatVersion { + t.Errorf("bad format_version: %q", d.FormatVersion) + } + if d.Placement != nd.Placement { + t.Errorf("bad placement: %q", d.Placement) + } + + // Update + var ud *Datadog + record(t, "datadog/update", func(c *Client) { + ud, err = c.UpdateDatadog(&UpdateDatadogInput{ + Service: testServiceID, + Version: tv.Number, + Name: "test-datadog", + NewName: String("new-test-datadog"), + Region: String("EU"), + FormatVersion: Uint(2), + }) + }) + if err != nil { + t.Fatal(err) + } + if ud.Name != "new-test-datadog" { + t.Errorf("bad name: %q", ud.Name) + } + if ud.FormatVersion != 2 { + t.Errorf("bad format_version: %q", ud.FormatVersion) + } + if ud.Region != "EU" { + t.Errorf("bad region: %q", ud.Region) + } + + // Delete + record(t, "datadog/delete", func(c *Client) { + err = c.DeleteDatadog(&DeleteDatadogInput{ + Service: testServiceID, + Version: tv.Number, + Name: "new-test-datadog", + }) + }) + if err != nil { + t.Fatal(err) + } +} + +func TestClient_ListDatadog_validation(t *testing.T) { + var err error + _, err = testClient.ListDatadog(&ListDatadogInput{ + Service: "", + }) + if err != ErrMissingService { + t.Errorf("bad error: %s", err) + } + + _, err = testClient.ListDatadog(&ListDatadogInput{ + Service: "foo", + Version: 0, + }) + if err != ErrMissingVersion { + t.Errorf("bad error: %s", err) + } +} + +func TestClient_CreateDatadog_validation(t *testing.T) { + var err error + _, err = testClient.CreateDatadog(&CreateDatadogInput{ + Service: "", + }) + if err != ErrMissingService { + t.Errorf("bad error: %s", err) + } + + _, err = testClient.CreateDatadog(&CreateDatadogInput{ + Service: "foo", + Version: 0, + }) + if err != ErrMissingVersion { + t.Errorf("bad error: %s", err) + } +} + +func TestClient_GetDatadog_validation(t *testing.T) { + var err error + _, err = testClient.GetDatadog(&GetDatadogInput{ + Service: "", + }) + if err != ErrMissingService { + t.Errorf("bad error: %s", err) + } + + _, err = testClient.GetDatadog(&GetDatadogInput{ + Service: "foo", + Version: 0, + }) + if err != ErrMissingVersion { + t.Errorf("bad error: %s", err) + } + + _, err = testClient.GetDatadog(&GetDatadogInput{ + Service: "foo", + Version: 1, + Name: "", + }) + if err != ErrMissingName { + t.Errorf("bad error: %s", err) + } +} + +func TestClient_UpdateDatadog_validation(t *testing.T) { + var err error + _, err = testClient.UpdateDatadog(&UpdateDatadogInput{ + Service: "", + }) + if err != ErrMissingService { + t.Errorf("bad error: %s", err) + } + + _, err = testClient.UpdateDatadog(&UpdateDatadogInput{ + Service: "foo", + Version: 0, + }) + if err != ErrMissingVersion { + t.Errorf("bad error: %s", err) + } + + _, err = testClient.UpdateDatadog(&UpdateDatadogInput{ + Service: "foo", + Version: 1, + Name: "", + }) + if err != ErrMissingName { + t.Errorf("bad error: %s", err) + } +} + +func TestClient_DeleteDatadog_validation(t *testing.T) { + var err error + err = testClient.DeleteDatadog(&DeleteDatadogInput{ + Service: "", + }) + if err != ErrMissingService { + t.Errorf("bad error: %s", err) + } + + err = testClient.DeleteDatadog(&DeleteDatadogInput{ + Service: "foo", + Version: 0, + }) + if err != ErrMissingVersion { + t.Errorf("bad error: %s", err) + } + + err = testClient.DeleteDatadog(&DeleteDatadogInput{ + Service: "foo", + Version: 1, + Name: "", + }) + if err != ErrMissingName { + t.Errorf("bad error: %s", err) + } +} diff --git a/fastly/fixtures/datadog/create.yaml b/fastly/fixtures/datadog/create.yaml new file mode 100644 index 000000000..2ed715dc6 --- /dev/null +++ b/fastly/fixtures/datadog/create.yaml @@ -0,0 +1,63 @@ +--- +version: 1 +interactions: +- request: + body: Service=7i6HN3TK9wS159v2gPAZ8A&Version=103&format=format&name=test-datadog&placement=waf_debug®ion=US&token=abcd1234 + form: + Service: + - 7i6HN3TK9wS159v2gPAZ8A + Version: + - "103" + format: + - format + name: + - test-datadog + placement: + - waf_debug + region: + - US + token: + - abcd1234 + headers: + Content-Type: + - application/x-www-form-urlencoded + User-Agent: + - FastlyGo/1.10.0 (+github.com/fastly/go-fastly; go1.14.2) + url: https://api.fastly.com/service/7i6HN3TK9wS159v2gPAZ8A/version/103/logging/datadog + method: POST + response: + body: '{"format":"format","name":"test-datadog","placement":"waf_debug","region":"US","token":"abcd1234","service_id":"7i6HN3TK9wS159v2gPAZ8A","version":"103","created_at":"2020-05-08T09:31:13Z","response_condition":"","deleted_at":null,"updated_at":"2020-05-08T09:31:13Z","format_version":"2"}' + headers: + Accept-Ranges: + - bytes + - bytes + Cache-Control: + - no-cache + Content-Type: + - application/json + Date: + - Fri, 08 May 2020 09:31:13 GMT + Fastly-Ratelimit-Remaining: + - "992" + Fastly-Ratelimit-Reset: + - "1588932000" + Status: + - 200 OK + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + Via: + - 1.1 varnish + - 1.1 varnish + X-Cache: + - MISS, MISS + X-Cache-Hits: + - 0, 0 + X-Served-By: + - cache-control-slwdc9035-CONTROL-SLWDC, cache-pao17446-PAO + X-Timer: + - S1588930273.018818,VS0,VE587 + status: 200 OK + code: 200 + duration: "" diff --git a/fastly/fixtures/datadog/delete.yaml b/fastly/fixtures/datadog/delete.yaml new file mode 100644 index 000000000..4ba1e2bb6 --- /dev/null +++ b/fastly/fixtures/datadog/delete.yaml @@ -0,0 +1,47 @@ +--- +version: 1 +interactions: +- request: + body: "" + form: {} + headers: + User-Agent: + - FastlyGo/1.10.0 (+github.com/fastly/go-fastly; go1.14.2) + url: https://api.fastly.com/service/7i6HN3TK9wS159v2gPAZ8A/version/103/logging/datadog/new-test-datadog + method: DELETE + response: + body: '{"status":"ok"}' + headers: + Accept-Ranges: + - bytes + - bytes + Cache-Control: + - no-cache + Content-Type: + - application/json + Date: + - Fri, 08 May 2020 09:31:14 GMT + Fastly-Ratelimit-Remaining: + - "990" + Fastly-Ratelimit-Reset: + - "1588932000" + Status: + - 200 OK + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + Via: + - 1.1 varnish + - 1.1 varnish + X-Cache: + - MISS, MISS + X-Cache-Hits: + - 0, 0 + X-Served-By: + - cache-control-slwdc9036-CONTROL-SLWDC, cache-pao17446-PAO + X-Timer: + - S1588930275.628010,VS0,VE299 + status: 200 OK + code: 200 + duration: "" diff --git a/fastly/fixtures/datadog/get.yaml b/fastly/fixtures/datadog/get.yaml new file mode 100644 index 000000000..63534c704 --- /dev/null +++ b/fastly/fixtures/datadog/get.yaml @@ -0,0 +1,47 @@ +--- +version: 1 +interactions: +- request: + body: "" + form: {} + headers: + User-Agent: + - FastlyGo/1.10.0 (+github.com/fastly/go-fastly; go1.14.2) + url: https://api.fastly.com/service/7i6HN3TK9wS159v2gPAZ8A/version/103/logging/datadog/test-datadog + method: GET + response: + body: '{"updated_at":"2020-05-08T09:31:13Z","deleted_at":null,"placement":"waf_debug","format":"format","format_version":"2","created_at":"2020-05-08T09:31:13Z","service_id":"7i6HN3TK9wS159v2gPAZ8A","token":"abcd1234","response_condition":"","region":"US","name":"test-datadog","version":"103"}' + headers: + Accept-Ranges: + - bytes + - bytes + - bytes + Age: + - "0" + - "0" + Cache-Control: + - no-cache + Content-Type: + - application/json + Date: + - Fri, 08 May 2020 09:31:14 GMT + Status: + - 200 OK + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + Via: + - 1.1 varnish + - 1.1 varnish + X-Cache: + - MISS, MISS + X-Cache-Hits: + - 0, 0 + X-Served-By: + - cache-control-slwdc9035-CONTROL-SLWDC, cache-pao17446-PAO + X-Timer: + - S1588930274.835205,VS0,VE177 + status: 200 OK + code: 200 + duration: "" diff --git a/fastly/fixtures/datadog/list.yaml b/fastly/fixtures/datadog/list.yaml new file mode 100644 index 000000000..f9080bc20 --- /dev/null +++ b/fastly/fixtures/datadog/list.yaml @@ -0,0 +1,47 @@ +--- +version: 1 +interactions: +- request: + body: "" + form: {} + headers: + User-Agent: + - FastlyGo/1.10.0 (+github.com/fastly/go-fastly; go1.14.2) + url: https://api.fastly.com/service/7i6HN3TK9wS159v2gPAZ8A/version/103/logging/datadog + method: GET + response: + body: '[{"response_condition":"","version":"103","deleted_at":null,"updated_at":"2020-05-08T09:31:13Z","name":"test-datadog","service_id":"7i6HN3TK9wS159v2gPAZ8A","format_version":"2","region":"US","format":"format","created_at":"2020-05-08T09:31:13Z","token":"abcd1234","placement":"waf_debug"}]' + headers: + Accept-Ranges: + - bytes + - bytes + - bytes + Age: + - "0" + - "0" + Cache-Control: + - no-cache + Content-Type: + - application/json + Date: + - Fri, 08 May 2020 09:31:13 GMT + Status: + - 200 OK + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + Via: + - 1.1 varnish + - 1.1 varnish + X-Cache: + - MISS, MISS + X-Cache-Hits: + - 0, 0 + X-Served-By: + - cache-control-slwdc9036-CONTROL-SLWDC, cache-pao17446-PAO + X-Timer: + - S1588930274.621863,VS0,VE197 + status: 200 OK + code: 200 + duration: "" diff --git a/fastly/fixtures/datadog/update.yaml b/fastly/fixtures/datadog/update.yaml new file mode 100644 index 000000000..c35edb2e6 --- /dev/null +++ b/fastly/fixtures/datadog/update.yaml @@ -0,0 +1,61 @@ +--- +version: 1 +interactions: +- request: + body: Name=test-datadog&Service=7i6HN3TK9wS159v2gPAZ8A&Version=103&format_version=2&name=new-test-datadog®ion=EU + form: + Name: + - test-datadog + Service: + - 7i6HN3TK9wS159v2gPAZ8A + Version: + - "103" + format_version: + - "2" + name: + - new-test-datadog + region: + - EU + headers: + Content-Type: + - application/x-www-form-urlencoded + User-Agent: + - FastlyGo/1.10.0 (+github.com/fastly/go-fastly; go1.14.2) + url: https://api.fastly.com/service/7i6HN3TK9wS159v2gPAZ8A/version/103/logging/datadog/test-datadog + method: PUT + response: + body: '{"token":"abcd1234","response_condition":"","region":"EU","created_at":"2020-05-08T09:31:13Z","service_id":"7i6HN3TK9wS159v2gPAZ8A","name":"new-test-datadog","version":"103","placement":"waf_debug","deleted_at":null,"updated_at":"2020-05-08T09:31:13Z","format_version":"2","format":"format"}' + headers: + Accept-Ranges: + - bytes + - bytes + Cache-Control: + - no-cache + Content-Type: + - application/json + Date: + - Fri, 08 May 2020 09:31:14 GMT + Fastly-Ratelimit-Remaining: + - "991" + Fastly-Ratelimit-Reset: + - "1588932000" + Status: + - 200 OK + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + Via: + - 1.1 varnish + - 1.1 varnish + X-Cache: + - MISS, MISS + X-Cache-Hits: + - 0, 0 + X-Served-By: + - cache-control-slwdc9035-CONTROL-SLWDC, cache-pao17446-PAO + X-Timer: + - S1588930274.029537,VS0,VE581 + status: 200 OK + code: 200 + duration: "" diff --git a/fastly/fixtures/datadog/version.yaml b/fastly/fixtures/datadog/version.yaml new file mode 100644 index 000000000..e68a5dcd0 --- /dev/null +++ b/fastly/fixtures/datadog/version.yaml @@ -0,0 +1,51 @@ +--- +version: 1 +interactions: +- request: + body: Service=7i6HN3TK9wS159v2gPAZ8A + form: + Service: + - 7i6HN3TK9wS159v2gPAZ8A + headers: + Content-Type: + - application/x-www-form-urlencoded + User-Agent: + - FastlyGo/1.10.0 (+github.com/fastly/go-fastly; go1.14.2) + url: https://api.fastly.com/service/7i6HN3TK9wS159v2gPAZ8A/version + method: POST + response: + body: '{"service_id":"7i6HN3TK9wS159v2gPAZ8A","number":103}' + headers: + Accept-Ranges: + - bytes + - bytes + Cache-Control: + - no-cache + Content-Type: + - application/json + Date: + - Fri, 08 May 2020 09:31:13 GMT + Fastly-Ratelimit-Remaining: + - "993" + Fastly-Ratelimit-Reset: + - "1588932000" + Status: + - 200 OK + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + Via: + - 1.1 varnish + - 1.1 varnish + X-Cache: + - MISS, MISS + X-Cache-Hits: + - 0, 0 + X-Served-By: + - cache-control-slwdc9037-CONTROL-SLWDC, cache-pao17446-PAO + X-Timer: + - S1588930273.649766,VS0,VE354 + status: 200 OK + code: 200 + duration: "" From ae26ca984da871149803ae64f6769446d16fac3c Mon Sep 17 00:00:00 2001 From: Colton McCurdy Date: Tue, 12 May 2020 14:08:49 -0400 Subject: [PATCH 2/3] decodeJSON -> decodeBodyMap Signed-off-by: Colton McCurdy --- fastly/datadog.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/fastly/datadog.go b/fastly/datadog.go index 59b0516ff..83d423e92 100644 --- a/fastly/datadog.go +++ b/fastly/datadog.go @@ -60,7 +60,7 @@ func (c *Client) ListDatadog(i *ListDatadogInput) ([]*Datadog, error) { } var d []*Datadog - if err := decodeJSON(&d, resp.Body); err != nil { + if err := decodeBodyMap(resp.Body, &d); err != nil { return nil, err } sort.Stable(datadogByName(d)) @@ -100,7 +100,7 @@ func (c *Client) CreateDatadog(i *CreateDatadogInput) (*Datadog, error) { } var d *Datadog - if err := decodeJSON(&d, resp.Body); err != nil { + if err := decodeBodyMap(resp.Body, &d); err != nil { return nil, err } return d, nil @@ -138,7 +138,7 @@ func (c *Client) GetDatadog(i *GetDatadogInput) (*Datadog, error) { } var d *Datadog - if err := decodeJSON(&d, resp.Body); err != nil { + if err := decodeBodyMap(resp.Body, &d); err != nil { return nil, err } return d, nil @@ -184,7 +184,7 @@ func (c *Client) UpdateDatadog(i *UpdateDatadogInput) (*Datadog, error) { } var d *Datadog - if err := decodeJSON(&d, resp.Body); err != nil { + if err := decodeBodyMap(resp.Body, &d); err != nil { return nil, err } return d, nil @@ -222,7 +222,7 @@ func (c *Client) DeleteDatadog(i *DeleteDatadogInput) error { } var r *statusResp - if err := decodeJSON(&r, resp.Body); err != nil { + if err := decodeBodyMap(resp.Body, &r); err != nil { return err } if !r.Ok() { From 5e61ce7dac5b1355c567b099b6cdcb847b78b0c0 Mon Sep 17 00:00:00 2001 From: Colton McCurdy Date: Wed, 13 May 2020 08:49:07 -0400 Subject: [PATCH 3/3] datadog: address @phamann's review comments Signed-off-by: Colton McCurdy --- fastly/datadog.go | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/fastly/datadog.go b/fastly/datadog.go index 83d423e92..489327b0b 100644 --- a/fastly/datadog.go +++ b/fastly/datadog.go @@ -7,7 +7,7 @@ import ( "time" ) -// Datadog represents a datadog response from the Fastly API. +// Datadog represents a Datadog response from the Fastly API. type Datadog struct { ServiceID string `mapstructure:"service_id"` Version int `mapstructure:"version"` @@ -18,13 +18,13 @@ type Datadog struct { Format string `mapstructure:"format"` FormatVersion uint `mapstructure:"format_version"` ResponseCondition string `mapstructure:"response_condition"` + Placement string `mapstructure:"placement"` CreatedAt *time.Time `mapstructure:"created_at"` UpdatedAt *time.Time `mapstructure:"updated_at"` DeletedAt *time.Time `mapstructure:"deleted_at"` - Placement string `mapstructure:"placement"` } -// datadogByName is a sortable list of datadog. +// datadogByName is a sortable list of Datadog. type datadogByName []*Datadog // Len, Swap, and Less implement the sortable interface. @@ -43,7 +43,7 @@ type ListDatadogInput struct { Version int } -// ListDatadog returns the list of datadog for the configuration version. +// ListDatadog returns the list of Datadog for the configuration version. func (c *Client) ListDatadog(i *ListDatadogInput) ([]*Datadog, error) { if i.Service == "" { return nil, ErrMissingService @@ -83,7 +83,7 @@ type CreateDatadogInput struct { Placement *string `form:"placement,omitempty"` } -// CreateDatadog creates a new Fastly datadog. +// CreateDatadog creates a new Datadog logging endpoint on a Fastly service version. func (c *Client) CreateDatadog(i *CreateDatadogInput) (*Datadog, error) { if i.Service == "" { return nil, ErrMissingService @@ -113,11 +113,11 @@ type GetDatadogInput struct { Service string Version int - // Name is the name of the datadog to fetch. + // Name is the name of the Datadog to fetch. Name string } -// GetDatadog gets the datadog configuration with the given parameters. +// GetDatadog gets the Datadog configuration with the given parameters. func (c *Client) GetDatadog(i *GetDatadogInput) (*Datadog, error) { if i.Service == "" { return nil, ErrMissingService @@ -151,7 +151,7 @@ type UpdateDatadogInput struct { Service string Version int - // Name is the name of the datadog to update. + // Name is the name of the Datadog to update. Name string NewName *string `form:"name,omitempty"` @@ -163,7 +163,7 @@ type UpdateDatadogInput struct { Placement *string `form:"placement,omitempty"` } -// UpdateDatadog updates a specific datadog. +// UpdateDatadog updates a Datadog logging endpoint on a Fastly service version. func (c *Client) UpdateDatadog(i *UpdateDatadogInput) (*Datadog, error) { if i.Service == "" { return nil, ErrMissingService @@ -197,11 +197,11 @@ type DeleteDatadogInput struct { Service string Version int - // Name is the name of the datadog to delete (required). + // Name is the name of the Datadog to delete (required). Name string } -// DeleteDatadog deletes the given datadog version. +// DeleteDatadog deletes a Datadog logging endpoint on a Fastly service version. func (c *Client) DeleteDatadog(i *DeleteDatadogInput) error { if i.Service == "" { return ErrMissingService