From d7f5fc46015061a426a5b720e0bba27c150d48a2 Mon Sep 17 00:00:00 2001 From: Jay Mundrawala Date: Mon, 5 Aug 2024 14:04:15 -0500 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Allow=20loading=20asset=20by=20mrn?= =?UTF-8?q?=20(#4485)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- providers/mondoo/resources/mondoo.lr.go | 2 +- providers/mondoo/resources/mondoo_assets.go | 64 +++++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/providers/mondoo/resources/mondoo.lr.go b/providers/mondoo/resources/mondoo.lr.go index b3164e4d6d..526305a478 100644 --- a/providers/mondoo/resources/mondoo.lr.go +++ b/providers/mondoo/resources/mondoo.lr.go @@ -31,7 +31,7 @@ func init() { Create: createMondooSpace, }, "mondoo.asset": { - // to override args, implement: initMondooAsset(runtime *plugin.Runtime, args map[string]*llx.RawData) (map[string]*llx.RawData, plugin.Resource, error) + Init: initMondooAsset, Create: createMondooAsset, }, "mondoo.resource": { diff --git a/providers/mondoo/resources/mondoo_assets.go b/providers/mondoo/resources/mondoo_assets.go index 17089e0483..e55f297b5b 100644 --- a/providers/mondoo/resources/mondoo_assets.go +++ b/providers/mondoo/resources/mondoo_assets.go @@ -8,14 +8,78 @@ import ( "go.mondoo.com/cnquery/v11/explorer/resources" "go.mondoo.com/cnquery/v11/llx" + "go.mondoo.com/cnquery/v11/providers-sdk/v1/plugin" "go.mondoo.com/cnquery/v11/providers/mondoo/connection" + "go.mondoo.com/cnquery/v11/types" "go.mondoo.com/cnquery/v11/utils/multierr" + mondoogql "go.mondoo.com/mondoo-go" ) func (m *mqlMondooAsset) id() (string, error) { return m.Mrn.Data, nil } +type gqlAsset struct { + ID string + Mrn string + State string + Name string + AssetType string `graphql:"asset_type"` + UpdatedAt *string + // Annotations map[string]string + Annotations []keyValue + Labels []keyValue + Score struct { + Grade string + Value int + } +} + +func initMondooAsset(runtime *plugin.Runtime, args map[string]*llx.RawData) (map[string]*llx.RawData, plugin.Resource, error) { + if len(args) != 1 { + return args, nil, nil + } + + // if asset is only initialized with a mrn, we will try to look it up + rawMrn, mrnOk := args["mrn"] + if !mrnOk { + return args, nil, nil + } + + // fetch the asset from mondoo + conn := runtime.Connection.(*connection.Connection) + asset, err := fetchAssetByMrn(context.Background(), conn, rawMrn.Value.(string)) + if err != nil { + return nil, nil, err + } + + args["name"] = llx.StringData(asset.Name) + args["mrn"] = llx.StringData(asset.Mrn) + args["platform"] = llx.StringData(asset.AssetType) + args["annotations"] = llx.MapData(keyvals2map(asset.Annotations), types.Map(types.String, types.String)) + args["labels"] = llx.MapData(keyvals2map(asset.Labels), types.Map(types.String, types.String)) + args["updatedAt"] = llx.TimeDataPtr(string2time(asset.UpdatedAt)) + args["scoreGrade"] = llx.StringData(asset.Score.Grade) + args["scoreValue"] = llx.IntData(asset.Score.Value) + + return args, nil, nil +} + +func fetchAssetByMrn(ctx context.Context, conn *connection.Connection, mrn string) (*gqlAsset, error) { + var q struct { + Asset gqlAsset `graphql:"asset(mrn: $mrn)"` + } + vars := map[string]any{ + "mrn": mondoogql.String(mrn), + } + + if err := conn.Client.Query(ctx, &q, vars); err != nil { + return nil, err + } + + return &q.Asset, nil +} + func (m *mqlMondooAsset) resources() ([]any, error) { conn := m.MqlRuntime.Connection.(*connection.Connection) upstream := conn.Upstream