Skip to content

Commit d4e79b9

Browse files
committed
fix: #473
1 parent 2c19f0c commit d4e79b9

File tree

7 files changed

+2375
-2519
lines changed

7 files changed

+2375
-2519
lines changed

.github/workflows/build.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,9 @@ jobs:
107107
go test ./...
108108
109109
- name: Generate recommendations json and check diff
110-
if: matrix.target_os == 'linux' && matrix.target_arch == 'amd64' && github.event_name != 'pull_request'
110+
if: matrix.target_os == 'linux' && matrix.target_arch == 'amd64'
111111
run: |
112+
go run ./cmd/azqr/main.go rules --json > ./data/recommendations.json
112113
git diff --exit-code ./data/recommendations.json
113114
114115
- name: Codecov

data/recommendations.json

Lines changed: 2266 additions & 2418 deletions
Large diffs are not rendered by default.

internal/graph/aprl

Submodule aprl updated 119 files

internal/renderers/recommendations.go

Lines changed: 65 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -19,95 +19,87 @@ func GetAllRecommendations(md bool) string {
1919

2020
var output string
2121

22+
recommendations := map[string]models.AzqrRecommendation{}
23+
graphRecommendations := map[string]models.AprlRecommendation{}
24+
for _, scanner := range serviceScanners {
25+
rm := scanner.GetRecommendations()
26+
27+
for _, r := range rm {
28+
recommendations[r.RecommendationID] = r
29+
}
30+
31+
for _, t := range scanner.ResourceTypes() {
32+
for _, r := range aprl[strings.ToLower(t)] {
33+
if strings.Contains(r.GraphQuery, "cannot-be-validated-with-arg") ||
34+
strings.Contains(r.GraphQuery, "under-development") ||
35+
strings.Contains(r.GraphQuery, "under development") {
36+
continue
37+
}
38+
graphRecommendations[r.RecommendationID] = r
39+
}
40+
}
41+
}
42+
43+
keys := make([]string, 0, len(recommendations))
44+
for k := range recommendations {
45+
keys = append(keys, k)
46+
}
47+
sort.Strings(keys)
48+
49+
graphKeys := make([]string, 0, len(graphRecommendations))
50+
for k := range graphRecommendations {
51+
graphKeys = append(graphKeys, k)
52+
}
53+
sort.Strings(graphKeys)
54+
2255
if md {
2356
output += "## Recommendations List\n\n"
2457
output += fmt.Sprintf("Total Supported Azure Resource Types: %d\n\n", len(aprl))
2558
output += "| | Id | Resource Type | Category | Impact | Recommendation | Learn\n"
2659
output += "---|---|---|---|---|---|---\n"
2760

2861
i := 0
29-
for _, scanner := range serviceScanners {
30-
rm := scanner.GetRecommendations()
3162

32-
recommendations := map[string]models.AzqrRecommendation{}
33-
for _, r := range rm {
34-
recommendations[r.RecommendationID] = r
35-
}
36-
37-
keys := make([]string, 0, len(recommendations))
38-
for k := range recommendations {
39-
keys = append(keys, k)
40-
}
41-
sort.Strings(keys)
42-
43-
for _, k := range keys {
44-
r := recommendations[k]
45-
i++
46-
output += fmt.Sprintf("%s | %s | %s | %s | %s | %s | [Learn](%s)\n", fmt.Sprint(i), r.RecommendationID, r.ResourceType, r.Category, r.Impact, r.Recommendation, r.LearnMoreUrl)
47-
}
48-
49-
for _, t := range scanner.ResourceTypes() {
50-
for _, r := range aprl[strings.ToLower(t)] {
51-
if strings.Contains(r.GraphQuery, "cannot-be-validated-with-arg") ||
52-
strings.Contains(r.GraphQuery, "under-development") ||
53-
strings.Contains(r.GraphQuery, "under development") {
54-
continue
55-
}
63+
for _, k := range keys {
64+
r := recommendations[k]
65+
i++
66+
output += fmt.Sprintf("%s | %s | %s | %s | %s | %s | [Learn](%s)\n", fmt.Sprint(i), r.RecommendationID, r.ResourceType, r.Category, r.Impact, r.Recommendation, r.LearnMoreUrl)
67+
}
5668

57-
i++
58-
output += fmt.Sprintf("%s | %s | %s | %s | %s | %s | [Learn](%s)\n", fmt.Sprint(i), r.RecommendationID, r.ResourceType, r.Category, r.Impact, r.Recommendation, r.LearnMoreLink[0].Url)
59-
}
60-
}
69+
for _, k := range graphKeys {
70+
r := graphRecommendations[k]
71+
i++
72+
output += fmt.Sprintf("%s | %s | %s | %s | %s | %s | [Learn](%s)\n", fmt.Sprint(i), r.RecommendationID, r.ResourceType, r.Category, r.Impact, r.Recommendation, r.LearnMoreLink[0].Url)
6173
}
6274
} else {
6375
j := []map[string]string{}
6476
i := 0
65-
for _, scanner := range serviceScanners {
66-
rm := scanner.GetRecommendations()
67-
68-
recommendations := map[string]models.AzqrRecommendation{}
69-
for _, r := range rm {
70-
recommendations[r.RecommendationID] = r
71-
}
7277

73-
keys := make([]string, 0, len(recommendations))
74-
for k := range recommendations {
75-
keys = append(keys, k)
76-
}
77-
sort.Strings(keys)
78-
79-
for _, k := range keys {
80-
j = append(j, map[string]string{})
81-
j[i] = map[string]string{}
82-
j[i]["recommendationId"] = recommendations[k].RecommendationID
83-
j[i]["resourceType"] = recommendations[k].ResourceType
84-
j[i]["category"] = string(recommendations[k].Category)
85-
j[i]["impact"] = string(recommendations[k].Impact)
86-
j[i]["recommendation"] = recommendations[k].Recommendation
87-
j[i]["learnMoreUrl"] = recommendations[k].LearnMoreUrl
88-
i++
89-
}
78+
for _, k := range keys {
79+
j = append(j, map[string]string{})
80+
j[i] = map[string]string{}
81+
j[i]["recommendationId"] = recommendations[k].RecommendationID
82+
j[i]["resourceType"] = recommendations[k].ResourceType
83+
j[i]["category"] = string(recommendations[k].Category)
84+
j[i]["impact"] = string(recommendations[k].Impact)
85+
j[i]["recommendation"] = recommendations[k].Recommendation
86+
j[i]["learnMoreUrl"] = recommendations[k].LearnMoreUrl
87+
i++
88+
}
9089

91-
for _, t := range scanner.ResourceTypes() {
92-
for _, r := range aprl[strings.ToLower(t)] {
93-
if strings.Contains(r.GraphQuery, "cannot-be-validated-with-arg") ||
94-
strings.Contains(r.GraphQuery, "under-development") ||
95-
strings.Contains(r.GraphQuery, "under development") {
96-
continue
97-
}
98-
99-
j = append(j, map[string]string{})
100-
j[i] = map[string]string{}
101-
j[i]["recommendationId"] = r.RecommendationID
102-
j[i]["resourceType"] = r.ResourceType
103-
j[i]["category"] = string(r.Category)
104-
j[i]["impact"] = string(r.Impact)
105-
j[i]["recommendation"] = r.Recommendation
106-
j[i]["learnMoreUrl"] = r.LearnMoreLink[0].Url
107-
i++
108-
}
109-
}
90+
for _, k := range graphKeys {
91+
r := graphRecommendations[k]
92+
j = append(j, map[string]string{})
93+
j[i] = map[string]string{}
94+
j[i]["recommendationId"] = r.RecommendationID
95+
j[i]["resourceType"] = r.ResourceType
96+
j[i]["category"] = string(r.Category)
97+
j[i]["impact"] = string(r.Impact)
98+
j[i]["recommendation"] = r.Recommendation
99+
j[i]["learnMoreUrl"] = r.LearnMoreLink[0].Url
100+
i++
110101
}
102+
111103
// print j as json to stdout
112104
js, err := json.MarshalIndent(j, "", "\t")
113105
if err != nil {

internal/renderers/report_data.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ func (rd *ReportData) RecommendationsTable() [][]string {
188188
implemented := "N/A"
189189
typeIsDeployed := false
190190
for _, resType := range rd.ResourceTypeCount {
191-
if strings.ToLower(resType.ResourceType) == strings.ToLower(r.ResourceType) {
191+
if strings.EqualFold(resType.ResourceType, r.ResourceType) {
192192
typeIsDeployed = true
193193
break
194194
}

scripts/test_graph_queries.sh

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#!/bin/bash
2+
3+
# Function to run KQL queries using Azure CLI
4+
# Arguments:
5+
# $1 - The KQL query to run
6+
runKqlQuery() {
7+
local kqlQuery="$1"
8+
echo "Running query: $kqlQuery"
9+
# Run the KQL query using the Azure CLI and stop on error
10+
az graph query -q "$kqlQuery" || { echo "Error running query: $kqlQuery"; exit 1; }
11+
}
12+
13+
# Find all .kql files in the specified directory
14+
kqlFiles=$(find internal/graph/azure-orphan-resources -type f -name "*.kql")
15+
16+
# Find all .kql files in the internal/graph/aprl/azure-resources directory and append them to kqlFiles
17+
aprlKqlFiles=$(find internal/graph/aprl/azure-resources -type f -name "*.kql")
18+
19+
# Combine kqlFiles and aprlKqlFiles into a single variable
20+
kqlFiles="$kqlFiles $aprlKqlFiles"
21+
22+
# Loop through each .kql file
23+
for kqlFile in $kqlFiles; do
24+
echo "Processing file: $kqlFile"
25+
26+
# Read the entire content of the .kql file
27+
kqlQuery=$(<"$kqlFile")
28+
29+
# dot not attempt to run th equery if it contains
30+
# "cannot-be-validated-with-arg, "under-development" or under development"
31+
if [[ "$kqlQuery" == *"cannot-be-validated-with-arg"* ]] || \
32+
[[ "$kqlQuery" == *"under-development"* ]] || \
33+
[[ "$kqlQuery" == *"under development"* ]]; then
34+
echo "Skipping query in $kqlFile due to manual validation or development status."
35+
continue
36+
fi
37+
38+
# Run the KQL query using the Azure CLI
39+
runKqlQuery "$kqlQuery"
40+
done

scripts/test_queries_orphan_resources.sh

Lines changed: 0 additions & 25 deletions
This file was deleted.

0 commit comments

Comments
 (0)