go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/_motor/discovery/gcp/instancesnapshot/resolver.go (about)

     1  // Copyright (c) Mondoo, Inc.
     2  // SPDX-License-Identifier: BUSL-1.1
     3  
     4  package instancesnapshot
     5  
     6  import (
     7  	"context"
     8  	"errors"
     9  
    10  	"go.mondoo.com/cnquery/motor/asset"
    11  	"go.mondoo.com/cnquery/motor/discovery/common"
    12  	"go.mondoo.com/cnquery/motor/providers"
    13  	"go.mondoo.com/cnquery/motor/providers/gcpinstancesnapshot"
    14  	"go.mondoo.com/cnquery/motor/vault"
    15  )
    16  
    17  type Resolver struct{}
    18  
    19  func (r *Resolver) Name() string {
    20  	return "GCP Compute Instance Resolver"
    21  }
    22  
    23  func (r *Resolver) AvailableDiscoveryTargets() []string {
    24  	return []string{"auto"}
    25  }
    26  
    27  func (r *Resolver) Resolve(ctx context.Context, root *asset.Asset, pCfg *providers.Config, credsResolver vault.Resolver, sfn common.QuerySecretFn, userIdDetectors ...providers.PlatformIdDetector) ([]*asset.Asset, error) {
    28  	pCfg.Backend = providers.ProviderType_GCP_COMPUTE_INSTANCE_SNAPSHOT
    29  
    30  	// determine the platform mrn
    31  	sc, err := gcpinstancesnapshot.NewSnapshotCreator()
    32  	if err != nil {
    33  		return nil, err
    34  	}
    35  
    36  	target := gcpinstancesnapshot.ParseTarget(pCfg)
    37  	var assetInfo *asset.Asset
    38  
    39  	switch target.TargetType {
    40  	case "instance":
    41  		instanceInfo, err := sc.InstanceInfo(target.ProjectID, target.Zone, target.InstanceName)
    42  		if err != nil {
    43  			return nil, err
    44  		}
    45  
    46  		assetInfo = &asset.Asset{
    47  			Name:        instanceInfo.InstanceName,
    48  			Connections: []*providers.Config{pCfg},
    49  			State:       asset.State_STATE_ONLINE,
    50  			Labels:      map[string]string{},
    51  			PlatformIds: []string{instanceInfo.PlatformMrn},
    52  		}
    53  	case "snapshot":
    54  		snapshotInfo, err := sc.SnapshotInfo(target.ProjectID, target.SnapshotName)
    55  		if err != nil {
    56  			return nil, err
    57  		}
    58  
    59  		assetInfo = &asset.Asset{
    60  			Name:        snapshotInfo.SnapshotName,
    61  			Connections: []*providers.Config{pCfg},
    62  			State:       asset.State_STATE_ONLINE,
    63  			Labels:      map[string]string{},
    64  			PlatformIds: []string{snapshotInfo.PlatformMrn},
    65  		}
    66  	default:
    67  		return nil, errors.New("GCP compute discovery does not support asset type " + target.TargetType)
    68  	}
    69  
    70  	// If there's a root-provided name, use that to overwrite
    71  	if root.Name != "" {
    72  		assetInfo.Name = root.Name
    73  	}
    74  
    75  	return []*asset.Asset{assetInfo}, nil
    76  }