Skip to content

Commit

Permalink
Add thread-safe add and get methods for plugin storage
Browse files Browse the repository at this point in the history
* Add general code improvements
  • Loading branch information
devashish-patel authored and nywilken committed Apr 30, 2024
1 parent 26b2bb8 commit 9ea5342
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 9 deletions.
6 changes: 3 additions & 3 deletions packer/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,22 +60,22 @@ type BuildMetadata struct {
func (b *CoreBuild) getPluginsMetadata() map[string]PluginDetails {
resp := map[string]PluginDetails{}

builderPlugin, builderPluginOk := PluginsDetailsStorage[fmt.Sprintf("%q-%q", PluginComponentBuilder, b.BuilderType)]
builderPlugin, builderPluginOk := GlobalPluginsDetailsStore.GetBuilder(b.BuilderType)
if builderPluginOk {
resp[builderPlugin.Name] = builderPlugin
}

for _, pp := range b.PostProcessors {
for _, p := range pp {
postprocessorsPlugin, postprocessorsPluginOk := PluginsDetailsStorage[fmt.Sprintf("%q-%q", PluginComponentPostProcessor, p.PType)]
postprocessorsPlugin, postprocessorsPluginOk := GlobalPluginsDetailsStore.GetPostProcessor(p.PType)
if postprocessorsPluginOk {
resp[postprocessorsPlugin.Name] = postprocessorsPlugin
}
}
}

for _, pv := range b.Provisioners {
provisionerPlugin, provisionerPluginOk := PluginsDetailsStorage[fmt.Sprintf("%q-%q", PluginComponentProvisioner, pv.PType)]
provisionerPlugin, provisionerPluginOk := GlobalPluginsDetailsStore.GetProvisioner(pv.PType)
if provisionerPluginOk {
resp[provisionerPlugin.Name] = provisionerPlugin
}
Expand Down
72 changes: 66 additions & 6 deletions packer/plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (
"regexp"
"runtime"
"strings"
"sync"

packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
pluginsdk "github.com/hashicorp/packer-plugin-sdk/plugin"
Expand Down Expand Up @@ -151,8 +152,7 @@ func (c *PluginConfig) DiscoverMultiPlugin(pluginName, pluginPath string) error
c.Builders.Set(key, func() (packersdk.Builder, error) {
return c.Client(pluginPath, "start", "builder", builderName).Builder()
})
PluginsDetailsStorage[fmt.Sprintf("%q-%q", PluginComponentBuilder, key)] = pluginDetails

GlobalPluginsDetailsStore.SetBuilder(key, pluginDetails)
}

if len(desc.Builders) > 0 {
Expand All @@ -168,7 +168,7 @@ func (c *PluginConfig) DiscoverMultiPlugin(pluginName, pluginPath string) error
c.PostProcessors.Set(key, func() (packersdk.PostProcessor, error) {
return c.Client(pluginPath, "start", "post-processor", postProcessorName).PostProcessor()
})
PluginsDetailsStorage[fmt.Sprintf("%q-%q", PluginComponentPostProcessor, key)] = pluginDetails
GlobalPluginsDetailsStore.SetPostProcessor(key, pluginDetails)
}

if len(desc.PostProcessors) > 0 {
Expand All @@ -184,7 +184,7 @@ func (c *PluginConfig) DiscoverMultiPlugin(pluginName, pluginPath string) error
c.Provisioners.Set(key, func() (packersdk.Provisioner, error) {
return c.Client(pluginPath, "start", "provisioner", provisionerName).Provisioner()
})
PluginsDetailsStorage[fmt.Sprintf("%q-%q", PluginComponentProvisioner, key)] = pluginDetails
GlobalPluginsDetailsStore.SetProvisioner(key, pluginDetails)

}
if len(desc.Provisioners) > 0 {
Expand All @@ -200,7 +200,7 @@ func (c *PluginConfig) DiscoverMultiPlugin(pluginName, pluginPath string) error
c.DataSources.Set(key, func() (packersdk.Datasource, error) {
return c.Client(pluginPath, "start", "datasource", datasourceName).Datasource()
})
PluginsDetailsStorage[fmt.Sprintf("%q-%q", PluginComponentDataSource, key)] = pluginDetails
GlobalPluginsDetailsStore.SetDataSource(key, pluginDetails)
}
if len(desc.Datasources) > 0 {
log.Printf("found external %v datasource from %s plugin", desc.Datasources, pluginName)
Expand Down Expand Up @@ -268,4 +268,64 @@ type PluginDetails struct {
PluginPath string
}

var PluginsDetailsStorage = map[string]PluginDetails{}
type pluginsDetailsStorage struct {
rwMutex sync.RWMutex
data map[string]PluginDetails
}

var GlobalPluginsDetailsStore = &pluginsDetailsStorage{
data: make(map[string]PluginDetails),
}

func (pds *pluginsDetailsStorage) set(key string, plugin PluginDetails) {
pds.rwMutex.Lock()
defer pds.rwMutex.Unlock()
pds.data[key] = plugin
}

func (pds *pluginsDetailsStorage) get(key string) (PluginDetails, bool) {
pds.rwMutex.RLock()
defer pds.rwMutex.RUnlock()
plugin, exists := pds.data[key]
return plugin, exists
}

func (pds *pluginsDetailsStorage) SetBuilder(name string, plugin PluginDetails) {
key := fmt.Sprintf("%q-%q", PluginComponentBuilder, name)
pds.set(key, plugin)
}

func (pds *pluginsDetailsStorage) GetBuilder(name string) (PluginDetails, bool) {
key := fmt.Sprintf("%q-%q", PluginComponentBuilder, name)
return pds.get(key)
}

func (pds *pluginsDetailsStorage) SetPostProcessor(name string, plugin PluginDetails) {
key := fmt.Sprintf("%q-%q", PluginComponentPostProcessor, name)
pds.set(key, plugin)
}

func (pds *pluginsDetailsStorage) GetPostProcessor(name string) (PluginDetails, bool) {
key := fmt.Sprintf("%q-%q", PluginComponentPostProcessor, name)
return pds.get(key)
}

func (pds *pluginsDetailsStorage) SetProvisioner(name string, plugin PluginDetails) {
key := fmt.Sprintf("%q-%q", PluginComponentProvisioner, name)
pds.set(key, plugin)
}

func (pds *pluginsDetailsStorage) GetProvisioner(name string) (PluginDetails, bool) {
key := fmt.Sprintf("%q-%q", PluginComponentProvisioner, name)
return pds.get(key)
}

func (pds *pluginsDetailsStorage) SetDataSource(name string, plugin PluginDetails) {
key := fmt.Sprintf("%q-%q", PluginComponentDataSource, name)
pds.set(key, plugin)
}

func (pds *pluginsDetailsStorage) GetDataSource(name string) (PluginDetails, bool) {
key := fmt.Sprintf("%q-%q", PluginComponentDataSource, name)
return pds.get(key)
}

0 comments on commit 9ea5342

Please sign in to comment.