Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Upgrade Latest Go Client - UserAgent Header adjustment #512

Merged
merged 8 commits into from
May 13, 2020
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion GNUmakefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ GOFMT_FILES?=$$(find . -name '*.go' |grep -v vendor)
WEBSITE_REPO=github.com/hashicorp/terraform-website
PKG_NAME=datadog
DIR=~/.terraform.d/plugins
ZORKIAN_VERSION=master
ZORKIAN_VERSION=v2.29.0
gzussa marked this conversation as resolved.
Show resolved Hide resolved
gzussa marked this conversation as resolved.
Show resolved Hide resolved
API_CLIENT_VERSION=master

default: build
Expand Down
6 changes: 2 additions & 4 deletions datadog/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import (
"fmt"
"log"
"net/url"
"runtime"

datadogV1 "github.com/DataDog/datadog-api-client-go/api/v1/datadog"
datadogV2 "github.com/DataDog/datadog-api-client-go/api/v2/datadog"
Expand Down Expand Up @@ -111,7 +110,7 @@ func providerConfigure(d *schema.ResourceData) (interface{}, error) {

c := cleanhttp.DefaultClient()
c.Transport = logging.NewTransport("Datadog", c.Transport)
communityClient.ExtraHeader["User-Agent"] = getUserAgent("")
communityClient.ExtraHeader["User-Agent"] = getUserAgent("go-datadog-api")
gzussa marked this conversation as resolved.
Show resolved Hide resolved
gzussa marked this conversation as resolved.
Show resolved Hide resolved
communityClient.HttpClient = c

if validate {
Expand Down Expand Up @@ -228,9 +227,8 @@ func translateClientError(err error, msg string) error {
}

func getUserAgent(clientUserAgent string) string {
return fmt.Sprintf("terraform-provider-datadog/%s (go %s; terraform %s; terraform-cli %s) %s",
return fmt.Sprintf("terraform-provider-datadog/%s (terraform %s; terraform-cli %s) %s",
version.ProviderVersion,
runtime.Version(),
gzussa marked this conversation as resolved.
Show resolved Hide resolved
meta.SDKVersionString(),
datadogProvider.TerraformVersion,
clientUserAgent)
Expand Down
122 changes: 119 additions & 3 deletions datadog/resource_datadog_monitor.go
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,119 @@ func buildMonitorStruct(d *schema.ResourceData) *datadogV1.Monitor {
return m
}

func buildMonitorUpdateRequestStruct(d *schema.ResourceData) *datadogV1.MonitorUpdateRequest {

var thresholds datadogV1.MonitorThresholds

if r, ok := d.GetOk("thresholds.ok"); ok {
v, _ := json.Number(r.(string)).Float64()
thresholds.SetOk(v)
}
if r, ok := d.GetOk("thresholds.warning"); ok {
v, _ := json.Number(r.(string)).Float64()
thresholds.SetWarning(v)
}
if r, ok := d.GetOk("thresholds.unknown"); ok {
v, _ := json.Number(r.(string)).Float64()
thresholds.SetUnknown(v)
}
if r, ok := d.GetOk("thresholds.critical"); ok {
v, _ := json.Number(r.(string)).Float64()
thresholds.SetCritical(v)
}
if r, ok := d.GetOk("thresholds.warning_recovery"); ok {
v, _ := json.Number(r.(string)).Float64()
thresholds.SetWarningRecovery(v)
}
if r, ok := d.GetOk("thresholds.critical_recovery"); ok {
v, _ := json.Number(r.(string)).Float64()
thresholds.SetCriticalRecovery(v)
}

var thresholdWindows datadogV1.MonitorThresholdWindowOptions

if r, ok := d.GetOk("threshold_windows.recovery_window"); ok {
thresholdWindows.SetRecoveryWindow(r.(string))
}

if r, ok := d.GetOk("threshold_windows.trigger_window"); ok {
thresholdWindows.SetTriggerWindow(r.(string))
}

o := datadogV1.MonitorOptions{}
o.SetThresholds(thresholds)
o.SetNotifyNoData(d.Get("notify_no_data").(bool))
o.SetRequireFullWindow(d.Get("require_full_window").(bool))
o.SetIncludeTags(d.Get("include_tags").(bool))

if thresholdWindows.HasRecoveryWindow() || thresholdWindows.HasTriggerWindow() {
o.SetThresholdWindows(thresholdWindows)
}

if attr, ok := d.GetOk("silenced"); ok {
s := make(map[string]int64)
// TODO: this is not very defensive, test if we can fail on non int input
for k, v := range attr.(map[string]interface{}) {
s[k] = int64(v.(int))
}
o.Silenced = &s
}
if attr, ok := d.GetOk("notify_no_data"); ok {
o.SetNotifyNoData(attr.(bool))
}
if attr, ok := d.GetOk("new_host_delay"); ok {
o.SetNewHostDelay(int64(attr.(int)))
}
if attr, ok := d.GetOk("evaluation_delay"); ok {
o.SetEvaluationDelay(int64(attr.(int)))
}
if attr, ok := d.GetOk("no_data_timeframe"); ok {
o.SetNoDataTimeframe(int64(attr.(int)))
}
if attr, ok := d.GetOk("renotify_interval"); ok {
o.SetRenotifyInterval(int64(attr.(int)))
}
if attr, ok := d.GetOk("notify_audit"); ok {
o.SetNotifyAudit(attr.(bool))
}
if attr, ok := d.GetOk("timeout_h"); ok {
o.SetTimeoutH(int64(attr.(int)))
}
if attr, ok := d.GetOk("escalation_message"); ok {
o.SetEscalationMessage(attr.(string))
}
if attr, ok := d.GetOk("locked"); ok {
o.SetLocked(attr.(bool))
}

monitorType := datadogV1.MonitorType(d.Get("type").(string))
if monitorType == datadogV1.MONITORTYPE_LOG_ALERT {
if attr, ok := d.GetOk("enable_logs_sample"); ok {
o.SetEnableLogsSample(attr.(bool))
} else {
o.SetEnableLogsSample(false)
}
}

m := datadogV1.NewMonitorUpdateRequest()
m.SetType(monitorType)
m.SetQuery(d.Get("query").(string))
m.SetName(d.Get("name").(string))
m.SetMessage(d.Get("message").(string))
m.SetOptions(o)

tags := make([]string, 0)
if attr, ok := d.GetOk("tags"); ok {
for _, s := range attr.(*schema.Set).List() {
tags = append(tags, s.(string))
}
sort.Strings(tags)
}
m.SetTags(tags)

return m
}

func resourceDatadogMonitorExists(d *schema.ResourceData, meta interface{}) (b bool, e error) {
// Exists - This is called to verify a resource still exists. It is called prior to Read,
// and lowers the burden of Read to be able to assume the resource exists.
Expand Down Expand Up @@ -466,7 +579,7 @@ func resourceDatadogMonitorUpdate(d *schema.ResourceData, meta interface{}) erro
datadogClientV1 := providerConf.DatadogClientV1
authV1 := providerConf.AuthV1

m := buildMonitorStruct(d)
m := buildMonitorUpdateRequestStruct(d)

i, err := strconv.ParseInt(d.Id(), 10, 64)
if err != nil {
Expand All @@ -487,7 +600,8 @@ func resourceDatadogMonitorUpdate(d *schema.ResourceData, meta interface{}) erro
silenced = true
}

if *m, _, err = datadogClientV1.MonitorsApi.UpdateMonitor(authV1, i).Body(*m).Execute(); err != nil {
monitorResp, _, err := datadogClientV1.MonitorsApi.UpdateMonitor(authV1, i).Body(*m).Execute()
if err != nil {
return translateClientError(err, "error updating monitor")
}

Expand All @@ -503,13 +617,14 @@ func resourceDatadogMonitorUpdate(d *schema.ResourceData, meta interface{}) erro
// they're "drift")
unmutedScopes := getUnmutedScopes(d)
if newSilenced, ok := d.GetOk("silenced"); ok && !silenced {
m.Options.SetSilenced(monitorResp.Options.GetSilenced())
gzussa marked this conversation as resolved.
Show resolved Hide resolved
mSilenced := m.Options.GetSilenced()
for k, _ := range mSilenced {
// Since the Datadog GO client doesn't support unmuting on all scopes, loop over GetSilenced() and set the
// end timestamp to time.Now().Unix()
mSilenced[k] = time.Now().Unix()
}
*m, _, err = datadogClientV1.MonitorsApi.UpdateMonitor(authV1, i).Body(*m).Execute()
monitorResp, _, err = datadogClientV1.MonitorsApi.UpdateMonitor(authV1, i).Body(*m).Execute()
if err != nil {
return translateClientError(err, "error updating monitor")
}
Expand All @@ -524,6 +639,7 @@ func resourceDatadogMonitorUpdate(d *schema.ResourceData, meta interface{}) erro

// Similarly, if the silenced attribute is -1, lets unmute those scopes
if len(unmutedScopes) != 0 {
m.Options.SetSilenced(monitorResp.Options.GetSilenced())
gzussa marked this conversation as resolved.
Show resolved Hide resolved
silencedList := m.Options.GetSilenced()
for _, scope := range unmutedScopes {
if _, ok := silencedList[scope]; ok {
Expand Down
112 changes: 105 additions & 7 deletions datadog/resource_datadog_service_level_objective.go
Original file line number Diff line number Diff line change
Expand Up @@ -151,12 +151,110 @@ func ValidateServiceLevelObjectiveTypeString(v interface{}, k string) (ws []stri

func buildServiceLevelObjectiveStruct(d *schema.ResourceData) *datadogV1.ServiceLevelObjective {

slo := &datadogV1.ServiceLevelObjective{
Id: datadogV1.PtrString(d.Id()),
Name: d.Get("name").(string),
Type: datadogV1.SLOType(d.Get("type").(string)),
slo := datadogV1.NewServiceLevelObjectiveWithDefaults()
slo.SetName(d.Get("name").(string))
slo.SetType(datadogV1.SLOType(d.Get("type").(string)))
slo.SetId(d.Id())

if attr, ok := d.GetOk("description"); ok {
slo.SetDescription(attr.(string))
}

switch slo.GetType() {
case datadogV1.SLOTYPE_MONITOR:
// monitor type
if attr, ok := d.GetOk("monitor_ids"); ok {
s := make([]int64, 0)
for _, v := range attr.(*schema.Set).List() {
s = append(s, int64(v.(int)))
}
slo.SetMonitorIds(s)
}
if attr, ok := d.GetOk("groups"); ok {
s := make([]string, 0)
for _, v := range attr.(*schema.Set).List() {
s = append(s, v.(string))
}
slo.SetGroups(s)
}
default:
// metric type
if attr, ok := d.GetOk("query"); ok {
queries := make([]map[string]interface{}, 0)
raw := attr.([]interface{})
for _, rawQuery := range raw {
if query, ok := rawQuery.(map[string]interface{}); ok {
queries = append(queries, query)
}
}
if len(queries) >= 1 {
// only use the first defined query
slo.SetQuery(*datadogV1.NewServiceLevelObjectiveQuery(
queries[0]["denominator"].(string),
queries[0]["numerator"].(string)))
}
gzussa marked this conversation as resolved.
Show resolved Hide resolved
}
}

if attr, ok := d.GetOk("tags"); ok {
s := make([]string, 0)
for _, v := range attr.(*schema.Set).List() {
s = append(s, v.(string))
}
slo.SetTags(s)
}

if _, ok := d.GetOk("thresholds"); ok {
numThresholds := d.Get("thresholds.#").(int)
sloThresholds := make([]datadogV1.SLOThreshold, 0)
for i := 0; i < numThresholds; i++ {
prefix := fmt.Sprintf("thresholds.%d.", i)
t := datadogV1.NewSLOThresholdWithDefaults()

if tf, ok := d.GetOk(prefix + "timeframe"); ok {
t.SetTimeframe(datadogV1.SLOTimeframe(tf.(string)))
}

if targetValue, ok := d.GetOk(prefix + "target"); ok {
if f, ok := floatOk(targetValue); ok {
t.SetTarget(f)
}
}

if warningValue, ok := d.GetOk(prefix + "warning"); ok {
if f, ok := floatOk(warningValue); ok {
t.SetWarning(f)
}
}

if targetDisplayValue, ok := d.GetOk(prefix + "target_display"); ok {
if s, ok := targetDisplayValue.(string); ok && strings.TrimSpace(s) != "" {
t.SetTargetDisplay(strings.TrimSpace(targetDisplayValue.(string)))
}
}

if warningDisplayValue, ok := d.GetOk(prefix + "warning_display"); ok {
if s, ok := warningDisplayValue.(string); ok && strings.TrimSpace(s) != "" {
t.SetWarningDisplay(strings.TrimSpace(warningDisplayValue.(string)))
gzussa marked this conversation as resolved.
Show resolved Hide resolved
}
}
sloThresholds = append(sloThresholds, *t)
}
if len(sloThresholds) > 0 {
slo.SetThresholds(sloThresholds)
}
}

return slo
}

func buildServiceLevelObjectiveRequestStruct(d *schema.ResourceData) *datadogV1.ServiceLevelObjectiveRequest {

slo := datadogV1.NewServiceLevelObjectiveRequestWithDefaults()
slo.SetName(d.Get("name").(string))
slo.SetType(datadogV1.SLOType(d.Get("type").(string)))
slo.SetId(d.Id())

if attr, ok := d.GetOk("description"); ok {
slo.SetDescription(attr.(string))
}
Expand Down Expand Up @@ -276,13 +374,13 @@ func resourceDatadogServiceLevelObjectiveCreate(d *schema.ResourceData, meta int
datadogClientV1 := providerConf.DatadogClientV1
authV1 := providerConf.AuthV1

slo := buildServiceLevelObjectiveStruct(d)
sloResp, _, err := datadogClientV1.ServiceLevelObjectivesApi.CreateSLO(authV1).Body(*slo).Execute()
slor := buildServiceLevelObjectiveRequestStruct(d)
sloResp, _, err := datadogClientV1.ServiceLevelObjectivesApi.CreateSLO(authV1).Body(*slor).Execute()
if err != nil {
return translateClientError(err, "error creating service level objective")
}

slo = &sloResp.GetData()[0]
slo := &sloResp.GetData()[0]
d.SetId(slo.GetId())

return resourceDatadogServiceLevelObjectiveRead(d, meta)
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
module github.com/terraform-providers/terraform-provider-datadog

require (
github.com/DataDog/datadog-api-client-go v1.0.0-beta.2
github.com/DataDog/datadog-api-client-go v1.0.0-beta.2.0.20200507190510-3fade721dd1a
github.com/cenkalti/backoff v2.1.1+incompatible // indirect
github.com/dnaeon/go-vcr v1.0.1
github.com/hashicorp/go-cleanhttp v0.5.1
Expand Down
7 changes: 3 additions & 4 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbf
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/DataDog/datadog-api-client-go v1.0.0-beta.2 h1:tav6+lH/q19H4wEuxhkhvN6KRmotqkqIBWuhxGYxk7M=
github.com/DataDog/datadog-api-client-go v1.0.0-beta.2/go.mod h1:ZIerq9SI/pcS9fBjSAe1k68EfexOJrzcp9uiOpJQhrA=
github.com/DataDog/datadog-api-client-go v1.0.0-beta.2.0.20200507190510-3fade721dd1a h1:g0K3y0DSRd53VChY1NzCMZT+Bi2UbZf2e8JoKUT+EaY=
github.com/DataDog/datadog-api-client-go v1.0.0-beta.2.0.20200507190510-3fade721dd1a/go.mod h1:ZIerq9SI/pcS9fBjSAe1k68EfexOJrzcp9uiOpJQhrA=
github.com/DataDog/datadog-go v3.6.0+incompatible h1:ILg7c5Y1KvZFDOaVS0higGmJ5Fal5O1KQrkrT9j6dSM=
github.com/DataDog/datadog-go v3.6.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
Expand Down Expand Up @@ -203,8 +203,7 @@ github.com/zclconf/go-cty v1.2.1 h1:vGMsygfmeCl4Xb6OA5U5XVAaQZ69FvoG7X2jUtQujb8=
github.com/zclconf/go-cty v1.2.1/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8=
github.com/zclconf/go-cty-yaml v1.0.1 h1:up11wlgAaDvlAGENcFDnZgkn0qUJurso7k6EpURKNF8=
github.com/zclconf/go-cty-yaml v1.0.1/go.mod h1:IP3Ylp0wQpYm50IHK8OZWKMu6sPJIUgKa8XhiVHura0=
github.com/zorkian/go-datadog-api v2.28.0+incompatible h1:bh/2jIkDFCZRjkuQKBFdmB+sScAMXf8fctKTT0ae+wE=
github.com/zorkian/go-datadog-api v2.28.0+incompatible/go.mod h1:PkXwHX9CUQa/FpB9ZwAD45N1uhCW4MT/Wj7m36PbKss=
github.com/zorkian/go-datadog-api v2.29.0+incompatible h1:uZZg0POZ6tLmVFtjUSaTZYwR6Q6RrHx6f/blTEDn8dA=
github.com/zorkian/go-datadog-api v2.29.0+incompatible/go.mod h1:PkXwHX9CUQa/FpB9ZwAD45N1uhCW4MT/Wj7m36PbKss=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4=
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading