github.com/turbot/steampipe@v1.7.0-rc.0.0.20240517123944-7cef272d4458/pkg/connection/config_map.go (about)

     1  package connection
     2  
     3  import (
     4  	typehelpers "github.com/turbot/go-kit/types"
     5  	sdkproto "github.com/turbot/steampipe-plugin-sdk/v5/grpc/proto"
     6  	"github.com/turbot/steampipe/pkg/steampipeconfig/modconfig"
     7  )
     8  
     9  type ConnectionConfigMap map[string]*sdkproto.ConnectionConfig
    10  
    11  // NewConnectionConfigMap creates a map of sdkproto.ConnectionConfig keyed by connection name
    12  // NOTE: connections in error are EXCLUDED
    13  func NewConnectionConfigMap(connectionMap map[string]*modconfig.Connection) ConnectionConfigMap {
    14  	configMap := make(ConnectionConfigMap)
    15  	for k, v := range connectionMap {
    16  		if v.Error != nil {
    17  			continue
    18  		}
    19  
    20  		configMap[k] = &sdkproto.ConnectionConfig{
    21  			Connection:       v.Name,
    22  			Plugin:           v.Plugin,
    23  			PluginShortName:  v.PluginAlias,
    24  			Config:           v.Config,
    25  			ChildConnections: v.GetResolveConnectionNames(),
    26  			PluginInstance:   typehelpers.SafeString(v.PluginInstance),
    27  		}
    28  	}
    29  
    30  	return configMap
    31  }
    32  
    33  func (m ConnectionConfigMap) Diff(otherMap ConnectionConfigMap) (addedConnections, deletedConnections, changedConnections map[string][]*sdkproto.ConnectionConfig) {
    34  	// results are maps of connections keyed by plugin instance
    35  	addedConnections = make(map[string][]*sdkproto.ConnectionConfig)
    36  	deletedConnections = make(map[string][]*sdkproto.ConnectionConfig)
    37  	changedConnections = make(map[string][]*sdkproto.ConnectionConfig)
    38  
    39  	for name, connection := range m {
    40  		if otherConnection, ok := otherMap[name]; !ok {
    41  			deletedConnections[connection.PluginInstance] = append(deletedConnections[connection.PluginInstance], connection)
    42  		} else {
    43  			// check for changes
    44  
    45  			// special case - if the plugin has changed, treat this as a deletion and a re-add
    46  			if connection.PluginInstance != otherConnection.PluginInstance {
    47  				addedConnections[otherConnection.PluginInstance] = append(addedConnections[otherConnection.PluginInstance], otherConnection)
    48  				deletedConnections[connection.PluginInstance] = append(deletedConnections[connection.PluginInstance], connection)
    49  			} else {
    50  				if !connection.Equals(otherConnection) {
    51  					changedConnections[connection.PluginInstance] = append(changedConnections[connection.PluginInstance], otherConnection)
    52  				}
    53  			}
    54  		}
    55  	}
    56  
    57  	for otherName, otherConnection := range otherMap {
    58  		if _, ok := m[otherName]; !ok {
    59  			addedConnections[otherConnection.PluginInstance] = append(addedConnections[otherConnection.PluginInstance], otherConnection)
    60  		}
    61  	}
    62  
    63  	return
    64  }