Skip to content

Commit 4790d27

Browse files
authored
feat(RAIN-91334): allow Rego queries to be created and retrieved (#1465)
* feat(RAIN-91334): allow Rego queries to be created and retrieved
1 parent 144c65b commit 4790d27

File tree

4 files changed

+69
-9
lines changed

4 files changed

+69
-9
lines changed

api/lql.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,9 @@ import (
2929
)
3030

3131
type NewQuery struct {
32-
QueryID string `json:"queryId" yaml:"queryId"`
33-
QueryText string `json:"queryText" yaml:"queryText"`
32+
QueryID string `json:"queryId" yaml:"queryId"`
33+
QueryLanguage *string `json:"queryLanguage,omitempty" yaml:"queryLanguage,omitempty"`
34+
QueryText string `json:"queryText" yaml:"queryText"`
3435
}
3536

3637
func ParseNewQuery(s string) (NewQuery, error) {
@@ -49,6 +50,7 @@ func ParseNewQuery(s string) (NewQuery, error) {
4950
if err == nil && !reflect.DeepEqual(query, NewQuery{}) { // empty string unmarshals w/o error
5051
return query, nil
5152
}
53+
5254
// invalid query
5355
return query, errors.New("unable to parse query")
5456
}
@@ -59,6 +61,7 @@ type UpdateQuery struct {
5961

6062
type Query struct {
6163
QueryID string `json:"queryId" yaml:"queryId"`
64+
QueryLanguage *string `json:"queryLanguage,omitempty" yaml:"queryLanguage,omitempty"`
6265
QueryText string `json:"queryText" yaml:"queryText"`
6366
Owner string `json:"owner"`
6467
LastUpdateTime string `json:"lastUpdateTime"`

api/lql_test.go

Lines changed: 56 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,15 @@ import (
2222
"encoding/json"
2323
"fmt"
2424
"net/http"
25+
"strings"
2526
"testing"
2627

2728
"github.com/pkg/errors"
2829
"github.com/stretchr/testify/assert"
2930

3031
"github.com/lacework/go-sdk/api"
3132
"github.com/lacework/go-sdk/internal/lacework"
33+
"github.com/lacework/go-sdk/internal/pointer"
3234
)
3335

3436
var (
@@ -46,6 +48,23 @@ var (
4648
queryId: %s
4749
queryText: %s`, newQuery.QueryID, newQuery.QueryText)
4850
lqlErrorReponse = `{ "message": "This is an error message" }`
51+
52+
regoQueryID = "my_rego"
53+
newRegoQueryText = "package clitest\n" +
54+
"import future.keywords\n" +
55+
"import data.lacework\n" +
56+
"source := lacework.aws.cfg.list(\"s3\", \"list-buckets\")\n" +
57+
"assess := assessment.violation(input, \"just because\")"
58+
newRegoQuery = api.NewQuery{
59+
QueryID: regoQueryID,
60+
QueryLanguage: pointer.Of("Rego"),
61+
QueryText: newRegoQueryText,
62+
}
63+
newRegoQueryJSON = fmt.Sprintf(`{
64+
"queryId": "%s",
65+
"queryLanguage": "Rego",
66+
"queryText": %#v
67+
}`, queryID, newRegoQueryText)
4968
)
5069

5170
func mockQueryDataResponse(data string) string {
@@ -129,8 +148,8 @@ func TestQueryCreateMethod(t *testing.T) {
129148
assert.Nil(t, err)
130149
}
131150

132-
func TestQueryCreateOK(t *testing.T) {
133-
mockResponse := mockQueryDataResponse(newQueryJSON)
151+
func createQueryOKTestHelper(t *testing.T, expectedResponseData string, testQuery api.NewQuery) {
152+
mockResponse := mockQueryDataResponse(expectedResponseData)
134153

135154
fakeServer := lacework.MockServer()
136155
fakeServer.MockAPI(
@@ -151,10 +170,26 @@ func TestQueryCreateOK(t *testing.T) {
151170
_ = json.Unmarshal([]byte(mockResponse), &createExpected)
152171

153172
var createActual api.QueryResponse
154-
createActual, err = c.V2.Query.Create(newQuery)
173+
createActual, err = c.V2.Query.Create(testQuery)
155174
assert.Nil(t, err)
156175

157176
assert.Equal(t, createExpected, createActual)
177+
178+
if strings.Contains(expectedResponseData, "queryLanguage") {
179+
assert.Equal(t, "Rego", *createActual.Data.QueryLanguage)
180+
} else {
181+
assert.Nil(t, createActual.Data.QueryLanguage)
182+
}
183+
}
184+
185+
func TestLQLQueryCreateOK(t *testing.T) {
186+
// queryLanguage is not available
187+
createQueryOKTestHelper(t, newQueryJSON, newQuery)
188+
}
189+
190+
func TestRegoQueryCreateOK(t *testing.T) {
191+
// queryLanguage is available
192+
createQueryOKTestHelper(t, newRegoQueryJSON, newRegoQuery)
158193
}
159194

160195
func TestQueryCreateError(t *testing.T) {
@@ -198,8 +233,8 @@ func TestQueryListMethod(t *testing.T) {
198233
assert.Nil(t, err)
199234
}
200235

201-
func TestQueryGetQueryByIDOK(t *testing.T) {
202-
mockResponse := mockQueryDataResponse(newQueryJSON)
236+
func getQueryByIDTestHelper(t *testing.T, expectedResponseData string, queryId string) {
237+
mockResponse := mockQueryDataResponse(expectedResponseData)
203238

204239
fakeServer := lacework.MockServer()
205240
fakeServer.MockAPI(
@@ -225,6 +260,22 @@ func TestQueryGetQueryByIDOK(t *testing.T) {
225260
assert.Nil(t, err)
226261

227262
assert.Equal(t, getExpected, getActual)
263+
264+
if strings.Contains(expectedResponseData, "queryLanguage") {
265+
assert.Equal(t, "Rego", *getActual.Data.QueryLanguage)
266+
} else {
267+
assert.Nil(t, getActual.Data.QueryLanguage)
268+
}
269+
}
270+
271+
func TestLQLQueryGetQueryByIDOK(t *testing.T) {
272+
// queryLanguage is not available
273+
getQueryByIDTestHelper(t, newQueryJSON, queryID)
274+
}
275+
276+
func TestRegoQueryGetQueryByIDOK(t *testing.T) {
277+
// queryLanguage is available
278+
getQueryByIDTestHelper(t, newRegoQueryJSON, regoQueryID)
228279
}
229280

230281
func TestQueryGetNotFound(t *testing.T) {

cli/cmd/lql_show.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,9 @@ func showQuery(_ *cobra.Command, args []string) error {
7171

7272
if cli.YAMLOutput() {
7373
return cli.OutputYAML(&api.NewQuery{
74-
QueryID: queryResponse.Data.QueryID,
75-
QueryText: queryResponse.Data.QueryText,
74+
QueryID: queryResponse.Data.QueryID,
75+
QueryLanguage: queryResponse.Data.QueryLanguage,
76+
QueryText: queryResponse.Data.QueryText,
7677
})
7778
}
7879

internal/pointer/bool.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,8 @@ func CompareBoolPtr(ptr *bool, b bool) bool {
88
}
99
return *ptr == b
1010
}
11+
12+
// Of is a helper to allow taking the address of a string literal
13+
func Of[E any](e E) *E {
14+
return &e
15+
}

0 commit comments

Comments
 (0)