-
Notifications
You must be signed in to change notification settings - Fork 69
/
service_packs_fetcher.go
126 lines (102 loc) · 3.31 KB
/
service_packs_fetcher.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package packs
import (
"context"
"fmt"
log "github.com/sirupsen/logrus"
"github.com/newrelic/newrelic-cli/internal/install/execution"
"github.com/newrelic/newrelic-cli/internal/install/recipes"
"github.com/newrelic/newrelic-cli/internal/install/types"
)
// ServicePacksFetcher is an implementation of the PacksFetcher interface that
// relies on the Nerdgraph-stitched o11y packs service to source its results.
type ServicePacksFetcher struct {
client recipes.NerdGraphClient
installStatus *execution.InstallStatus
}
// NewServicePacksFetcher returns a new instance of ServicePacksFetcher.
func NewServicePacksFetcher(client recipes.NerdGraphClient, s *execution.InstallStatus) *ServicePacksFetcher {
f := ServicePacksFetcher{
client: client,
installStatus: s,
}
return &f
}
func (f *ServicePacksFetcher) FetchPacks(ctx context.Context, recipes []types.OpenInstallationRecipe) ([]types.OpenInstallationObservabilityPack, error) {
log.Tracef("FetchPacks.recipes: %+v", recipes)
packs := []types.OpenInstallationObservabilityPack{}
for _, r := range recipes {
if len(r.ObservabilityPacks) > 0 {
log.Tracef("Observability Pack Filters: %+v", r.ObservabilityPacks)
for _, p := range r.ObservabilityPacks {
log.Tracef("Current recipe.ObservabilityPacks filter: %+v", p)
f.installStatus.ObservabilityPackFetchPending(execution.ObservabilityPackStatusEvent{Name: p.Name})
criteria := createObservabilityPackCriteriaInput(&p)
vars := map[string]interface{}{
"criteria": criteria,
}
var resp searchQueryResult
if err := f.client.QueryWithResponseAndContext(ctx, observabilityPackSearchQuery, vars, &resp); err != nil {
f.installStatus.ObservabilityPackFetchFailed(execution.ObservabilityPackStatusEvent{
Name: p.Name,
Msg: fmt.Sprintf("failed to query observabilityPackSearch | criteria=[%+v] error=[%s]", criteria, err),
})
return nil, fmt.Errorf("failed to query observabilityPackSearch: %s", err)
}
results := resp.Docs.OpenInstallation.ObservabilityPackSearch.Results.ObservabilityPacks
for _, v := range results {
f.installStatus.ObservabilityPackFetchSuccess(execution.ObservabilityPackStatusEvent{ObservabilityPack: v})
packs = append(packs, v)
}
}
}
}
return packs, nil
}
func createObservabilityPackCriteriaInput(f *types.OpenInstallationObservabilityPackFilter) *types.OpenInstallationObservabilityPackInputCriteria {
log.WithFields(log.Fields{
"observabilityPack": f,
}).Debug("criteria input")
c := types.OpenInstallationObservabilityPackInputCriteria{
Name: f.Name,
Level: f.Level,
}
return &c
}
type searchQueryResult struct {
Docs observabilityPackSearchDocs `json:"docs"`
}
type observabilityPackSearchDocs struct {
OpenInstallation types.OpenInstallationDocsStitchedFields `json:"openInstallation"`
}
const (
observabilityPackSearchQuery = `
query ObservabilityPackSearch($criteria: OpenInstallationObservabilityPackInputCriteria){
docs {
openInstallation {
observabilityPackSearch(criteria: $criteria) {
results {
` + observabilityPackResultFragment + `
}
}
}
}
}`
observabilityPackResultFragment = `
observabilityPacks {
id
name
level
description
authors
iconUrl
logoUrl
websiteUrl
dashboards {
name
description
screenshots
url
}
}
`
)