Skip to content

Commit 8fd55df

Browse files
committed
🧹 optimized k8s asset discovery
Signed-off-by: Ivan Milchev <[email protected]>
1 parent 40ab0ce commit 8fd55df

23 files changed

+116
-97
lines changed

explorer/scan/discovery.go

+1
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ func discoverAssets(rootAssetWithRuntime *AssetWithRuntime, resolvedRootAsset *i
205205
if !discoveredAssets.Add(resolvedAsset, assetWithRuntime.Runtime) {
206206
assetWithRuntime.Runtime.Close()
207207
}
208+
discoverAssets(assetWithRuntime, resolvedRootAsset, discoveredAssets, runtimeLabels, upstream, recording)
208209
} else {
209210
discoverAssets(assetWithRuntime, resolvedRootAsset, discoveredAssets, runtimeLabels, upstream, recording)
210211
assetWithRuntime.Runtime.Close()

providers/k8s/resources/clusterrole.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ type mqlK8sRbacClusterroleInternal struct {
2222
}
2323

2424
func (k *mqlK8s) clusterroles() ([]interface{}, error) {
25-
return k8sResourceToMql(k.MqlRuntime, gvkString(rbacv1.SchemeGroupVersion.WithKind("clusterroles")), func(kind string, resource runtime.Object, obj metav1.Object, objT metav1.Type) (interface{}, error) {
25+
return k8sResourceToMql(k.MqlRuntime, gvkString(rbacv1.SchemeGroupVersion.WithKind("clusterroles")), getNamespaceScope(k.MqlRuntime), func(kind string, resource runtime.Object, obj metav1.Object, objT metav1.Type) (interface{}, error) {
2626
ts := obj.GetCreationTimestamp()
2727
clusterRole, ok := resource.(*rbacv1.ClusterRole)
2828
if !ok {

providers/k8s/resources/clusterrolebinding.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ type mqlK8sRbacClusterrolebindingInternal struct {
2222
}
2323

2424
func (k *mqlK8s) clusterrolebindings() ([]interface{}, error) {
25-
return k8sResourceToMql(k.MqlRuntime, gvkString(rbacv1.SchemeGroupVersion.WithKind("clusterrolebindings")), func(kind string, resource runtime.Object, obj metav1.Object, objT metav1.Type) (interface{}, error) {
25+
return k8sResourceToMql(k.MqlRuntime, gvkString(rbacv1.SchemeGroupVersion.WithKind("clusterrolebindings")), getNamespaceScope(k.MqlRuntime), func(kind string, resource runtime.Object, obj metav1.Object, objT metav1.Type) (interface{}, error) {
2626
ts := obj.GetCreationTimestamp()
2727

2828
clusterRoleBinding, ok := resource.(*rbacv1.ClusterRoleBinding)

providers/k8s/resources/common.go

+10-2
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,14 @@ func gvkString(gvk schema.GroupVersionKind) string {
3232
return gvk.Kind + "." + gvk.Version + "." + gvk.Group
3333
}
3434

35-
func k8sResourceToMql(r *plugin.Runtime, kind string, fn resourceConvertFn) ([]interface{}, error) {
35+
func k8sResourceToMql(r *plugin.Runtime, kind, ns string, fn resourceConvertFn) ([]interface{}, error) {
3636
kt, err := k8sProvider(r.Connection)
3737
if err != nil {
3838
return nil, err
3939
}
4040

4141
// TODO: check if we are running in a namespace scope and retrieve the ns from the provider
42-
result, err := kt.Resources(kind, "", "")
42+
result, err := kt.Resources(kind, "", ns)
4343
if err != nil {
4444
return nil, err
4545
}
@@ -70,6 +70,14 @@ func k8sResourceToMql(r *plugin.Runtime, kind string, fn resourceConvertFn) ([]i
7070
return resp, nil
7171
}
7272

73+
func getNamespaceScope(runtime *plugin.Runtime) string {
74+
asset := runtime.Connection.(shared.Connection).Asset()
75+
if asset.Platform.Name == "k8s-namespace" {
76+
return asset.Name
77+
}
78+
return ""
79+
}
80+
7381
func getNameAndNamespace(runtime *plugin.Runtime) (string, string, error) {
7482
asset := runtime.Connection.(shared.Connection).Asset()
7583
return asset.Labels["k8s.mondoo.com/name"], asset.Labels["k8s.mondoo.com/namespace"], nil

providers/k8s/resources/configmap.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ type mqlK8sConfigmapInternal struct {
2222
}
2323

2424
func (k *mqlK8s) configmaps() ([]interface{}, error) {
25-
return k8sResourceToMql(k.MqlRuntime, gvkString(corev1.SchemeGroupVersion.WithKind("configmaps")), func(kind string, resource runtime.Object, obj metav1.Object, objT metav1.Type) (interface{}, error) {
25+
return k8sResourceToMql(k.MqlRuntime, gvkString(corev1.SchemeGroupVersion.WithKind("configmaps")), getNamespaceScope(k.MqlRuntime), func(kind string, resource runtime.Object, obj metav1.Object, objT metav1.Type) (interface{}, error) {
2626
ts := obj.GetCreationTimestamp()
2727

2828
cm, ok := resource.(*corev1.ConfigMap)

providers/k8s/resources/cronjob.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ type mqlK8sCronjobInternal struct {
2222
}
2323

2424
func (k *mqlK8s) cronjobs() ([]interface{}, error) {
25-
return k8sResourceToMql(k.MqlRuntime, gvkString(batchv1.SchemeGroupVersion.WithKind("cronjobs")), func(kind string, resource runtime.Object, obj metav1.Object, objT metav1.Type) (interface{}, error) {
25+
return k8sResourceToMql(k.MqlRuntime, gvkString(batchv1.SchemeGroupVersion.WithKind("cronjobs")), getNamespaceScope(k.MqlRuntime), func(kind string, resource runtime.Object, obj metav1.Object, objT metav1.Type) (interface{}, error) {
2626
ts := obj.GetCreationTimestamp()
2727

2828
r, err := CreateResource(k.MqlRuntime, "k8s.cronjob", map[string]*llx.RawData{

providers/k8s/resources/customresource.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ func (k *mqlK8s) customresources() ([]interface{}, error) {
4141
return nil, err
4242
}
4343

44-
mqlResources, err := k8sResourceToMql(k.MqlRuntime, crd.GetName(), func(kind string, resource runtime.Object, obj metav1.Object, objT metav1.Type) (interface{}, error) {
44+
mqlResources, err := k8sResourceToMql(k.MqlRuntime, crd.GetName(), getNamespaceScope(k.MqlRuntime), func(kind string, resource runtime.Object, obj metav1.Object, objT metav1.Type) (interface{}, error) {
4545
ts := obj.GetCreationTimestamp()
4646

4747
r, err := CreateResource(k.MqlRuntime, "k8s.customresource", map[string]*llx.RawData{

providers/k8s/resources/daemonset.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ type mqlK8sDaemonsetInternal struct {
2222
}
2323

2424
func (k *mqlK8s) daemonsets() ([]interface{}, error) {
25-
return k8sResourceToMql(k.MqlRuntime, gvkString(appsv1.SchemeGroupVersion.WithKind("daemonsets")), func(kind string, resource runtime.Object, obj metav1.Object, objT metav1.Type) (interface{}, error) {
25+
return k8sResourceToMql(k.MqlRuntime, gvkString(appsv1.SchemeGroupVersion.WithKind("daemonsets")), getNamespaceScope(k.MqlRuntime), func(kind string, resource runtime.Object, obj metav1.Object, objT metav1.Type) (interface{}, error) {
2626
ts := obj.GetCreationTimestamp()
2727

2828
r, err := CreateResource(k.MqlRuntime, "k8s.daemonset", map[string]*llx.RawData{

providers/k8s/resources/deployment.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ type mqlK8sDeploymentInternal struct {
2222
}
2323

2424
func (k *mqlK8s) deployments() ([]interface{}, error) {
25-
return k8sResourceToMql(k.MqlRuntime, gvkString(appsv1.SchemeGroupVersion.WithKind("deployments")), func(kind string, resource runtime.Object, obj metav1.Object, objT metav1.Type) (interface{}, error) {
25+
return k8sResourceToMql(k.MqlRuntime, gvkString(appsv1.SchemeGroupVersion.WithKind("deployments")), getNamespaceScope(k.MqlRuntime), func(kind string, resource runtime.Object, obj metav1.Object, objT metav1.Type) (interface{}, error) {
2626
ts := obj.GetCreationTimestamp()
2727

2828
r, err := CreateResource(k.MqlRuntime, "k8s.deployment", map[string]*llx.RawData{

providers/k8s/resources/discovery.go

+84-75
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package resources
66
import (
77
"bytes"
88
"fmt"
9+
"slices"
910
"strings"
1011

1112
"github.com/gobwas/glob"
@@ -110,6 +111,19 @@ func Discover(runtime *plugin.Runtime, features cnquery.Features) (*inventory.In
110111
return nil, err
111112
}
112113

114+
if asset := conn.Asset(); asset.Platform.Name == "k8s-namespace" {
115+
nsFilter = NamespaceFilterOpts{include: []string{asset.Name}}
116+
117+
od := NewPlatformIdOwnershipIndex(asset.PlatformIds[0])
118+
assets, err := discoverNamespaceAssets(runtime, conn, invConfig, asset.PlatformIds[0], k8s, nsFilter, resFilters, od)
119+
if err != nil {
120+
return nil, err
121+
}
122+
setRelatedAssets(conn, asset, assets, od, features)
123+
in.Spec.Assets = append(in.Spec.Assets, assets...)
124+
return in, nil
125+
}
126+
113127
// If we can discover the cluster asset, then we use that as root and build all
114128
// platform IDs for the assets based on it. If we cannot discover the cluster, we
115129
// discover the individual namespaces according to the ns filter and then build
@@ -132,14 +146,14 @@ func Discover(runtime *plugin.Runtime, features cnquery.Features) (*inventory.In
132146

133147
od := NewPlatformIdOwnershipIndex(assetId)
134148

135-
assets, err := discoverAssets(runtime, conn, invConfig, assetId, k8s, nsFilter, resFilters, od, false)
149+
assets, err := discoverNamespaces(conn, invConfig, "", nsFilter, nil)
136150
if err != nil {
137151
return nil, err
138152
}
139153
setRelatedAssets(conn, root, assets, od, features)
140154
in.Spec.Assets = append(in.Spec.Assets, assets...)
141155
} else {
142-
nss, err := discoverNamespaces(conn, invConfig, "", nil, nsFilter)
156+
nss, err := discoverNamespaces(conn, invConfig, "", nsFilter, nil)
143157
if err != nil {
144158
return nil, err
145159
}
@@ -149,25 +163,83 @@ func Discover(runtime *plugin.Runtime, features cnquery.Features) (*inventory.In
149163
}
150164

151165
// Discover the assets for each namespace and use the namespace platform ID as root
152-
for _, ns := range nss {
153-
nsFilter = NamespaceFilterOpts{include: []string{ns.Name}}
166+
// for _, ns := range nss {
167+
// nsFilter = NamespaceFilterOpts{include: []string{ns.Name}}
154168

155-
od := NewPlatformIdOwnershipIndex(ns.PlatformIds[0])
169+
// od := NewPlatformIdOwnershipIndex(ns.PlatformIds[0])
170+
// assets, err := discoverNamespaceAssets(runtime, conn, invConfig, ns.PlatformIds[0], k8s, nsFilter, resFilters, od)
171+
// if err != nil {
172+
// return nil, err
173+
// }
174+
// setRelatedAssets(conn, ns, assets, od, features)
175+
// in.Spec.Assets = append(in.Spec.Assets, assets...)
176+
// }
177+
}
156178

157-
// We don't want to discover the namespaces again since we have already done this above
158-
assets, err := discoverAssets(runtime, conn, invConfig, ns.PlatformIds[0], k8s, nsFilter, resFilters, od, true)
179+
return in, nil
180+
}
181+
182+
func discoverNamespaces(
183+
conn shared.Connection,
184+
invConfig *inventory.Config,
185+
clusterId string,
186+
nsFilter NamespaceFilterOpts,
187+
od *PlatformIdOwnershipIndex,
188+
) ([]*inventory.Asset, error) {
189+
if slices.Contains(invConfig.Discover.Targets, DiscoveryNamespaces) || slices.Contains(invConfig.Discover.Targets, DiscoveryAuto) {
190+
// We don't use MQL here since we need to handle k8s permission errors
191+
nss, err := conn.Namespaces()
192+
if err != nil {
193+
if k8sErrors.IsForbidden(err) && len(nsFilter.include) > 0 {
194+
for _, ns := range nsFilter.include {
195+
n, err := conn.Namespace(ns)
196+
if err != nil {
197+
return nil, err
198+
}
199+
nss = append(nss, *n)
200+
}
201+
} else {
202+
return nil, errors.Wrap(err, "failed to list namespaces")
203+
}
204+
}
205+
206+
assetList := make([]*inventory.Asset, 0, len(nss))
207+
for _, ns := range nss {
208+
if skip := nsFilter.skipNamespace(ns.Name); skip {
209+
continue
210+
}
211+
212+
labels := map[string]string{}
213+
for k, v := range ns.Labels {
214+
labels[k] = v
215+
}
216+
addMondooAssetLabels(labels, &ns.ObjectMeta, clusterId)
217+
platform, err := createPlatformData(ns.Kind, conn.Runtime())
159218
if err != nil {
160219
return nil, err
161220
}
162-
setRelatedAssets(conn, ns, assets, od, features)
163-
in.Spec.Assets = append(in.Spec.Assets, assets...)
221+
assetList = append(assetList, &inventory.Asset{
222+
PlatformIds: []string{
223+
shared.NewNamespacePlatformId(clusterId, ns.Name, string(ns.UID)),
224+
},
225+
Name: ns.Name,
226+
Platform: platform,
227+
Labels: labels,
228+
// We don't want a parent connection so there is no central cache for the resources
229+
// for the complete cluster. We only cache resources for a single namespace
230+
Connections: []*inventory.Config{invConfig.Clone()},
231+
Category: conn.Asset().Category,
232+
})
233+
if od != nil {
234+
od.Add(&ns)
235+
}
164236
}
237+
return assetList, nil
165238
}
166-
167-
return in, nil
239+
return nil, nil
168240
}
169241

170-
func discoverAssets(
242+
func discoverNamespaceAssets(
171243
runtime *plugin.Runtime,
172244
conn shared.Connection,
173245
invConfig *inventory.Config,
@@ -176,7 +248,6 @@ func discoverAssets(
176248
nsFilter NamespaceFilterOpts,
177249
resFilters *ResourceFilters,
178250
od *PlatformIdOwnershipIndex,
179-
skipNsDiscovery bool,
180251
) ([]*inventory.Asset, error) {
181252
var assets []*inventory.Asset
182253
var err error
@@ -252,13 +323,6 @@ func discoverAssets(
252323
}
253324
assets = append(assets, list...)
254325
}
255-
if target == DiscoveryNamespaces && !skipNsDiscovery {
256-
list, err = discoverNamespaces(conn, invConfig, clusterId, od, nsFilter)
257-
if err != nil {
258-
return nil, err
259-
}
260-
assets = append(assets, list...)
261-
}
262326
if target == DiscoveryContainerImages || target == DiscoveryAll {
263327
list, err = discoverContainerImages(conn, runtime, invConfig, clusterId, k8s, nsFilter)
264328
if err != nil {
@@ -807,61 +871,6 @@ func discoverIngresses(
807871
return assetList, nil
808872
}
809873

810-
func discoverNamespaces(
811-
conn shared.Connection,
812-
invConfig *inventory.Config,
813-
clusterId string,
814-
od *PlatformIdOwnershipIndex,
815-
nsFilter NamespaceFilterOpts,
816-
) ([]*inventory.Asset, error) {
817-
// We don't use MQL here since we need to handle k8s permission errors
818-
nss, err := conn.Namespaces()
819-
if err != nil {
820-
if k8sErrors.IsForbidden(err) && len(nsFilter.include) > 0 {
821-
for _, ns := range nsFilter.include {
822-
n, err := conn.Namespace(ns)
823-
if err != nil {
824-
return nil, err
825-
}
826-
nss = append(nss, *n)
827-
}
828-
} else {
829-
return nil, errors.Wrap(err, "failed to list namespaces")
830-
}
831-
}
832-
833-
assetList := make([]*inventory.Asset, 0, len(nss))
834-
for _, ns := range nss {
835-
if skip := nsFilter.skipNamespace(ns.Name); skip {
836-
continue
837-
}
838-
839-
labels := map[string]string{}
840-
for k, v := range ns.Labels {
841-
labels[k] = v
842-
}
843-
addMondooAssetLabels(labels, &ns.ObjectMeta, clusterId)
844-
platform, err := createPlatformData(ns.Kind, conn.Runtime())
845-
if err != nil {
846-
return nil, err
847-
}
848-
assetList = append(assetList, &inventory.Asset{
849-
PlatformIds: []string{
850-
shared.NewNamespacePlatformId(clusterId, ns.Name, string(ns.UID)),
851-
},
852-
Name: ns.Name,
853-
Platform: platform,
854-
Labels: labels,
855-
Connections: []*inventory.Config{invConfig.Clone(inventory.WithoutDiscovery(), inventory.WithParentConnectionId(invConfig.Id))}, // pass-in the parent connection config
856-
Category: conn.Asset().Category,
857-
})
858-
if od != nil {
859-
od.Add(&ns)
860-
}
861-
}
862-
return assetList, nil
863-
}
864-
865874
func discoverContainerImages(conn shared.Connection, runtime *plugin.Runtime, invConfig *inventory.Config, clusterId string, k8s *mqlK8s, nsFilter NamespaceFilterOpts) ([]*inventory.Asset, error) {
866875
pods := k8s.GetPods()
867876
if pods.Error != nil {

providers/k8s/resources/ingress.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ type mqlK8sIngressInternal struct {
2626
}
2727

2828
func (k *mqlK8s) ingresses() ([]interface{}, error) {
29-
return k8sResourceToMql(k.MqlRuntime, gvkString(networkingv1.SchemeGroupVersion.WithKind("ingresses")), func(kind string, resource runtime.Object, obj metav1.Object, objT metav1.Type) (interface{}, error) {
29+
return k8sResourceToMql(k.MqlRuntime, gvkString(networkingv1.SchemeGroupVersion.WithKind("ingresses")), getNamespaceScope(k.MqlRuntime), func(kind string, resource runtime.Object, obj metav1.Object, objT metav1.Type) (interface{}, error) {
3030
ts := obj.GetCreationTimestamp()
3131

3232
ingress, ok := resource.(*networkingv1.Ingress)

providers/k8s/resources/job.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ type mqlK8sJobInternal struct {
2222
}
2323

2424
func (k *mqlK8s) jobs() ([]interface{}, error) {
25-
return k8sResourceToMql(k.MqlRuntime, gvkString(batchv1.SchemeGroupVersion.WithKind("jobs")), func(kind string, resource runtime.Object, obj metav1.Object, objT metav1.Type) (interface{}, error) {
25+
return k8sResourceToMql(k.MqlRuntime, gvkString(batchv1.SchemeGroupVersion.WithKind("jobs")), getNamespaceScope(k.MqlRuntime), func(kind string, resource runtime.Object, obj metav1.Object, objT metav1.Type) (interface{}, error) {
2626
ts := obj.GetCreationTimestamp()
2727

2828
r, err := CreateResource(k.MqlRuntime, "k8s.job", map[string]*llx.RawData{

providers/k8s/resources/networkpolicy.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ type mqlK8sNetworkpolicyInternal struct {
2121
}
2222

2323
func (k *mqlK8s) networkPolicies() ([]interface{}, error) {
24-
return k8sResourceToMql(k.MqlRuntime, gvkString(networkingv1.SchemeGroupVersion.WithKind("networkpolicies")), func(kind string, resource runtime.Object, obj metav1.Object, objT metav1.Type) (interface{}, error) {
24+
return k8sResourceToMql(k.MqlRuntime, gvkString(networkingv1.SchemeGroupVersion.WithKind("networkpolicies")), getNamespaceScope(k.MqlRuntime), func(kind string, resource runtime.Object, obj metav1.Object, objT metav1.Type) (interface{}, error) {
2525
ts := obj.GetCreationTimestamp()
2626

2727
networkPolicy, ok := resource.(*networkingv1.NetworkPolicy)

providers/k8s/resources/node.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ func initK8sNode(runtime *plugin.Runtime, args map[string]*llx.RawData) (map[str
5353

5454
func (k *mqlK8s) nodes() ([]interface{}, error) {
5555
k.mqlK8sInternal.nodesByName = make(map[string]*mqlK8sNode)
56-
return k8sResourceToMql(k.MqlRuntime, gvkString(corev1.SchemeGroupVersion.WithKind("nodes")), func(kind string, resource runtime.Object, obj metav1.Object, objT metav1.Type) (interface{}, error) {
56+
return k8sResourceToMql(k.MqlRuntime, gvkString(corev1.SchemeGroupVersion.WithKind("nodes")), "", func(kind string, resource runtime.Object, obj metav1.Object, objT metav1.Type) (interface{}, error) {
5757
ts := obj.GetCreationTimestamp()
5858

5959
n, ok := obj.(*corev1.Node)

providers/k8s/resources/pod.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ type mqlK8sPodInternal struct {
2222
}
2323

2424
func (k *mqlK8s) pods() ([]interface{}, error) {
25-
return k8sResourceToMql(k.MqlRuntime, gvkString(corev1.SchemeGroupVersion.WithKind("pods")), func(kind string, resource runtime.Object, obj metav1.Object, objT metav1.Type) (interface{}, error) {
25+
// TODO: make sure the function below retrieves scoped down resources when the current asset is a namespace
26+
return k8sResourceToMql(k.MqlRuntime, gvkString(corev1.SchemeGroupVersion.WithKind("pods")), getNamespaceScope(k.MqlRuntime), func(kind string, resource runtime.Object, obj metav1.Object, objT metav1.Type) (interface{}, error) {
2627
ts := obj.GetCreationTimestamp()
2728

2829
r, err := CreateResource(k.MqlRuntime, "k8s.pod", map[string]*llx.RawData{

providers/k8s/resources/podsecuritypolicy.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ type mqlK8sPodsecuritypolicyInternal struct {
2020
}
2121

2222
func (k *mqlK8s) podSecurityPolicies() ([]interface{}, error) {
23-
return k8sResourceToMql(k.MqlRuntime, gvkString(policyv1beta1.SchemeGroupVersion.WithKind("podsecuritypolicies")), func(kind string, resource runtime.Object, obj metav1.Object, objT metav1.Type) (interface{}, error) {
23+
return k8sResourceToMql(k.MqlRuntime, gvkString(policyv1beta1.SchemeGroupVersion.WithKind("podsecuritypolicies")), getNamespaceScope(k.MqlRuntime), func(kind string, resource runtime.Object, obj metav1.Object, objT metav1.Type) (interface{}, error) {
2424
ts := obj.GetCreationTimestamp()
2525

2626
psp, ok := resource.(*policyv1beta1.PodSecurityPolicy)

providers/k8s/resources/replicaset.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ type mqlK8sReplicasetInternal struct {
2222
}
2323

2424
func (k *mqlK8s) replicasets() ([]interface{}, error) {
25-
return k8sResourceToMql(k.MqlRuntime, gvkString(appsv1.SchemeGroupVersion.WithKind("replicasets")), func(kind string, resource runtime.Object, obj metav1.Object, objT metav1.Type) (interface{}, error) {
25+
return k8sResourceToMql(k.MqlRuntime, gvkString(appsv1.SchemeGroupVersion.WithKind("replicasets")), getNamespaceScope(k.MqlRuntime), func(kind string, resource runtime.Object, obj metav1.Object, objT metav1.Type) (interface{}, error) {
2626
ts := obj.GetCreationTimestamp()
2727

2828
r, err := CreateResource(k.MqlRuntime, "k8s.replicaset", map[string]*llx.RawData{

providers/k8s/resources/role.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ type mqlK8sRbacRoleInternal struct {
2222
}
2323

2424
func (k *mqlK8s) roles() ([]interface{}, error) {
25-
return k8sResourceToMql(k.MqlRuntime, gvkString(rbacv1.SchemeGroupVersion.WithKind("roles")), func(kind string, resource runtime.Object, obj metav1.Object, objT metav1.Type) (interface{}, error) {
25+
return k8sResourceToMql(k.MqlRuntime, gvkString(rbacv1.SchemeGroupVersion.WithKind("roles")), getNamespaceScope(k.MqlRuntime), func(kind string, resource runtime.Object, obj metav1.Object, objT metav1.Type) (interface{}, error) {
2626
ts := obj.GetCreationTimestamp()
2727

2828
role, ok := resource.(*rbacv1.Role)

0 commit comments

Comments
 (0)