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

     1  // Copyright (c) Mondoo, Inc.
     2  // SPDX-License-Identifier: BUSL-1.1
     3  
     4  package terraform
     5  
     6  import (
     7  	"context"
     8  	"path/filepath"
     9  
    10  	"go.mondoo.com/cnquery/motor/asset"
    11  	"go.mondoo.com/cnquery/motor/discovery/common"
    12  	"go.mondoo.com/cnquery/motor/motorid"
    13  	"go.mondoo.com/cnquery/motor/providers"
    14  	"go.mondoo.com/cnquery/motor/providers/resolver"
    15  	"go.mondoo.com/cnquery/motor/vault"
    16  )
    17  
    18  type Resolver struct{}
    19  
    20  func (r *Resolver) Name() string {
    21  	return "Terraform Static Analysis Resolver"
    22  }
    23  
    24  func (r *Resolver) AvailableDiscoveryTargets() []string {
    25  	return []string{common.DiscoveryAuto, common.DiscoveryAll}
    26  }
    27  
    28  func (r *Resolver) Resolve(ctx context.Context, root *asset.Asset, tc *providers.Config, credsResolver vault.Resolver, sfn common.QuerySecretFn, userIdDetectors ...providers.PlatformIdDetector) ([]*asset.Asset, error) {
    29  	name := ""
    30  	if tc.Options["path"] != "" {
    31  		// manifest parent directory name
    32  		name = common.ProjectNameFromPath(tc.Options["path"])
    33  	}
    34  
    35  	assetObj := &asset.Asset{
    36  		Name:        root.Name,
    37  		Connections: []*providers.Config{tc},
    38  		State:       asset.State_STATE_ONLINE,
    39  		Labels:      map[string]string{},
    40  	}
    41  
    42  	if assetObj.Name == "" {
    43  		assetObj.Name = "Terraform Static Analysis " + name
    44  	}
    45  
    46  	// we have 3 different asset types for terraform: hcl, plan and state
    47  	// platform name will differ: terraform-hcl, terraform-plan, terraform-state
    48  	// platform family will be terraform
    49  
    50  	path, ok := tc.Options["path"]
    51  	if ok {
    52  		absPath, _ := filepath.Abs(path)
    53  		assetObj.Labels["path"] = absPath
    54  	}
    55  
    56  	m, err := resolver.NewMotorConnection(ctx, tc, credsResolver)
    57  	if err != nil {
    58  		return nil, err
    59  	}
    60  	defer m.Close()
    61  
    62  	// determine platform information
    63  	p, err := m.Platform()
    64  	if err == nil {
    65  		assetObj.Platform = p
    66  	}
    67  
    68  	fingerprint, err := motorid.IdentifyPlatform(m.Provider, p, userIdDetectors)
    69  	if err != nil {
    70  		return nil, err
    71  	}
    72  	assetObj.PlatformIds = fingerprint.PlatformIDs
    73  	if fingerprint.Name != "" {
    74  		assetObj.Name = fingerprint.Name
    75  	}
    76  
    77  	return []*asset.Asset{assetObj}, nil
    78  }