diff --git a/.gitignore b/.gitignore index 0ed58a3..b8eacc4 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ /test/fixture/output /my-debug *.log -/.vscode \ No newline at end of file +/.vscode +/tmp diff --git a/cmd/backup/backup_alertsconditions.go b/cmd/backup/backup_alertsconditions.go index 8d9bfd9..c96c280 100644 --- a/cmd/backup/backup_alertsconditions.go +++ b/cmd/backup/backup_alertsconditions.go @@ -25,6 +25,7 @@ import ( "github.com/IBM/newrelic-cli/cmd/get" "github.com/IBM/newrelic-cli/newrelic" "github.com/IBM/newrelic-cli/tracker" + "github.com/IBM/newrelic-cli/utils" "github.com/spf13/cobra" ) @@ -159,7 +160,7 @@ var alertsconditionsCmd = &cobra.Command{ backupPolicyMeta.FileName = backupFolder + "/all-in-one-bundle.alert-conditions.bak" } else { backupPolicyMeta.Policy = strconv.FormatInt(ID, 10) - backupPolicyMeta.FileName = backupFolder + "/" + fileNamePrefix + ".alert-conditions.bak" + backupPolicyMeta.FileName = backupFolder + "/" + utils.FileNameEscape(fileNamePrefix) + ".alert-conditions.bak" } backupPolicyMeta.OperationStatus = "fail" // backupPolicyMeta.PolicyName = policyName @@ -242,7 +243,7 @@ var alertsconditionsCmd = &cobra.Command{ if err != nil { fmt.Println(err) } - var fileName = backupFolder + "/" + fileNamePrefix + ".alert-conditions.bak" + var fileName = backupFolder + "/" + utils.FileNameEscape(fileNamePrefix) + ".alert-conditions.bak" err = ioutil.WriteFile(fileName, fileContent, 0666) if err != nil { fmt.Println(err) diff --git a/cmd/backup/backup_dashboards.go b/cmd/backup/backup_dashboards.go index 4047fe6..949a078 100644 --- a/cmd/backup/backup_dashboards.go +++ b/cmd/backup/backup_dashboards.go @@ -23,6 +23,7 @@ import ( "github.com/IBM/newrelic-cli/cmd/get" "github.com/IBM/newrelic-cli/tracker" + "github.com/IBM/newrelic-cli/utils" "github.com/spf13/cobra" "github.com/tidwall/gjson" "github.com/tidwall/pretty" @@ -131,7 +132,7 @@ var dashboardsCmd = &cobra.Command{ id := gjson.Parse(dashboard.String()).Get("id") title := gjson.Parse(dashboard.String()).Get("title") name := title.String() - var fileName = backupFolder + "/" + name + "-" + id.String() + ".dashboard.bak" + var fileName = backupFolder + "/" + utils.FileNameEscape(name) + "-" + id.String() + ".dashboard.bak" if bSingle == true { fileName = backupFolder + "/all-in-one-bundle.dashboard.bak" } diff --git a/cmd/backup/backup_monitors.go b/cmd/backup/backup_monitors.go index 7363e8b..4632d85 100644 --- a/cmd/backup/backup_monitors.go +++ b/cmd/backup/backup_monitors.go @@ -23,6 +23,7 @@ import ( "github.com/IBM/newrelic-cli/cmd/get" "github.com/IBM/newrelic-cli/tracker" + "github.com/IBM/newrelic-cli/utils" "github.com/spf13/cobra" ) @@ -108,7 +109,7 @@ var monitorsCmd = &cobra.Command{ if err != nil { fmt.Println(err) } - var fileName = backupFolder + "/" + name + ".monitor.bak" + var fileName = backupFolder + "/" + utils.FileNameEscape(name) + ".monitor.bak" err = ioutil.WriteFile(fileName, fileContent, 0666) if err != nil { fmt.Println(err) diff --git a/cmd/get/get_alertsconditions.go b/cmd/get/get_alertsconditions.go index 7e26930..6a971d9 100644 --- a/cmd/get/get_alertsconditions.go +++ b/cmd/get/get_alertsconditions.go @@ -181,10 +181,11 @@ func GetAllConditionsByAlertPolicyID(id int64) (*newrelic.AlertsConditionList, e var defaultConditionsLen = len(list.AlertsDefaultConditions) var externalServiceConditionsLen = len(list.AlertsExternalServiceConditions) var nrqlConditionsLen = len(list.AlertsNRQLConditions) - var pluginsConditionsLen = len(list.AlertsPluginsConditions) + //var pluginsConditionsLen = len(list.AlertsPluginsConditions) var syntheticsConditionsLen = len(list.AlertsSyntheticsConditions) - if defaultConditionsLen == 0 && externalServiceConditionsLen == 0 && nrqlConditionsLen == 0 && pluginsConditionsLen == 0 && syntheticsConditionsLen == 0 { + //if defaultConditionsLen == 0 && externalServiceConditionsLen == 0 && nrqlConditionsLen == 0 && pluginsConditionsLen == 0 && syntheticsConditionsLen == 0 { + if defaultConditionsLen == 0 && externalServiceConditionsLen == 0 && nrqlConditionsLen == 0 && syntheticsConditionsLen == 0 { break } else { //merge conditions list diff --git a/cmd/get/get_monitors.go b/cmd/get/get_monitors.go index 0c7a0a4..243e061 100644 --- a/cmd/get/get_monitors.go +++ b/cmd/get/get_monitors.go @@ -138,7 +138,11 @@ func GetMonitors() ([]*newrelic.Monitor, error, tracker.ReturnValue) { fmt.Printf("Fetching script for Monitor: %s\n", name) scriptText, resp, err := client.SyntheticsScript.GetByID(context.Background(), id) <-chTaskCtrl - tracker.AppendRESTCallResult(client.SyntheticsScript, tracker.OPERATION_NAME_GET_MONITOR_SCRIPT, resp.StatusCode, "monitor id: "+id+", monitor name: "+name) + statusCode := -1 + if resp != nil { + statusCode = resp.StatusCode + } + tracker.AppendRESTCallResult(client.SyntheticsScript, tracker.OPERATION_NAME_GET_MONITOR_SCRIPT, statusCode, "monitor id: "+id+", monitor name: "+name) if err != nil { fmt.Println(err) r <- nil diff --git a/newrelic/alerts_conditions.go b/newrelic/alerts_conditions.go index 637e71c..9ee5bb1 100644 --- a/newrelic/alerts_conditions.go +++ b/newrelic/alerts_conditions.go @@ -74,7 +74,8 @@ func (s *AlertsConditionsService) ListAll(ctx context.Context, opt *AlertsCondit } list := new(AlertsConditionList) - cats := []ConditionCategory{ConditionDefault, ConditionPlugins, ConditionExternalService, ConditionSynthetics, ConditionNRQL, ConditionInfrastructure} + //cats := []ConditionCategory{ConditionDefault, ConditionPlugins, ConditionExternalService, ConditionSynthetics, ConditionNRQL, ConditionInfrastructure} + cats := []ConditionCategory{ConditionDefault, ConditionExternalService, ConditionSynthetics, ConditionNRQL, ConditionInfrastructure} for _, cat := range cats { // TODO: paralleize and use ctx.Done() to cancel the parent context listFunc := s.listByCategory(cat) diff --git a/newrelic/alerts_plugins_conditions.go b/newrelic/alerts_plugins_conditions.go index d199179..1282c50 100644 --- a/newrelic/alerts_plugins_conditions.go +++ b/newrelic/alerts_plugins_conditions.go @@ -30,7 +30,7 @@ type AlertsPluginsCondition struct { ID *int64 `json:"id,omitempty"` Name *string `json:"name,omitempty"` Enabled *bool `json:"enabled,omitempty"` - Entities []*int64 `json:"entities,omitempty"` + Entities []*string `json:"entities,omitempty"` MetricDescription *string `json:"metric_description,omitempty"` Metric *string `json:"metric,omitempty"` ValueFunction *string `json:"value_function,omitempty"` diff --git a/newrelic/base.go b/newrelic/base.go index 653d400..dbe1dad 100644 --- a/newrelic/base.go +++ b/newrelic/base.go @@ -20,11 +20,11 @@ import ( "context" "encoding/base64" "encoding/json" - "errors" "fmt" "io" "io/ioutil" "log" + "math/rand" "net/http" "net/url" "reflect" @@ -238,19 +238,21 @@ func (c *Client) Do(ctx context.Context, req *http.Request, v interface{}) (*Res var resp *http.Response var err error + sleepBase := 30 for retries > 0 { resp, err = c.client.Do(req) if err != nil || resp.StatusCode > 299 { if retries == 1 { - if err == nil { + if resp != nil { bodyBytes, _ := ioutil.ReadAll(resp.Body) bodyString := truncateString(string(bodyBytes), 100) - err = errors.New(fmt.Sprintf("%s %s returns status:%d body: %s", req.Method, req.URL.String(), resp.StatusCode, bodyString)) + fmt.Printf("%s %s returns status:%d body: %s", req.Method, req.URL.String(), resp.StatusCode, bodyString) } - log.Println(err) + fmt.Println(err) break } - time.Sleep(time.Duration(3) * time.Second) + time.Sleep(time.Duration(sleepBase+rand.Intn(30)) * time.Second) + sleepBase = sleepBase * 2 retries-- } else { break diff --git a/tracker/result_tracker.go b/tracker/result_tracker.go index d17a58b..e351cf1 100644 --- a/tracker/result_tracker.go +++ b/tracker/result_tracker.go @@ -417,7 +417,7 @@ func GenerateBackupMonitorMeta(monitorList []*newrelic.Monitor, backupFolder str if singleFile == true { m.FileName = backupFolder + "/all-in-one-bundle.monitor.bak" } else { - m.FileName = backupFolder + "/" + m.Name + ".monitor.bak" + m.FileName = backupFolder + "/" + utils.FileNameEscape(m.Name) + ".monitor.bak" } backupMonitorMetaList = append(backupMonitorMetaList, m) } diff --git a/utils/util.go b/utils/util.go index 56f27c2..0c0444a 100644 --- a/utils/util.go +++ b/utils/util.go @@ -21,6 +21,7 @@ import ( "net/url" "os" "strconv" + "strings" "github.com/IBM/newrelic-cli/newrelic" ) @@ -290,3 +291,9 @@ func MergeAlertChannelList(s1 []*newrelic.AlertsChannel, s2 []*newrelic.AlertsCh return slice } + +func FileNameEscape(origName string) string { + name := strings.Replace(origName, ":", "%3A", -1) + name = strings.Replace(name, "/", "%2F", -1) + return name +}