Skip to content

Commit ea657c1

Browse files
authored
Fix remote policy ref resolution for plugins (#3992)
1 parent f82c819 commit ea657c1

File tree

3 files changed

+74
-2
lines changed

3 files changed

+74
-2
lines changed

private/buf/bufctl/controller.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1621,6 +1621,18 @@ func newStaticPolicyPluginKeyProviderForPolicyConfigs(
16211621
policyConfigs []bufconfig.PolicyConfig,
16221622
policyNameToRemotePluginKeys map[string][]bufplugin.PluginKey,
16231623
) (bufpolicy.PolicyPluginKeyProvider, error) {
1624+
policyNames, err := xslices.ToUniqueValuesMap(policyConfigs, func(policyConfig bufconfig.PolicyConfig) string {
1625+
policyName := policyConfig.Name()
1626+
if policyConfig.Ref() != nil {
1627+
// Remote policies are required to be referenced by their full name.
1628+
// The buf.lock stores the name.
1629+
policyName = policyConfig.Ref().FullName().String()
1630+
}
1631+
return policyName
1632+
})
1633+
if err != nil {
1634+
return nil, fmt.Errorf("failed to validate policy names in policy configs: %w", err)
1635+
}
16241636
// We do not validate that all remote PolicyConfig plugins are present in the buf.lock file.
16251637
// This would require loading the PolicyConfig data. Check is defered to the runtime.
16261638
for policyName, remotePluginKeys := range policyNameToRemotePluginKeys {
@@ -1630,6 +1642,9 @@ func newStaticPolicyPluginKeyProviderForPolicyConfigs(
16301642
if err != nil {
16311643
return nil, fmt.Errorf("failed to validate remote PluginKeys for Policy %q: %w", policyName, err)
16321644
}
1645+
if _, ok := policyNames[policyName]; !ok {
1646+
return nil, fmt.Errorf("remote plugins configured for unknown policy %q", policyName)
1647+
}
16331648
}
16341649
return bufpolicy.NewStaticPolicyPluginKeyProvider(policyNameToRemotePluginKeys)
16351650
}

private/bufpkg/bufpolicy/policy_plugin_data_provider.go

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@
1515
package bufpolicy
1616

1717
import (
18+
"context"
19+
"fmt"
20+
"io/fs"
21+
22+
"github.com/bufbuild/buf/private/bufpkg/bufparse"
1823
"github.com/bufbuild/buf/private/bufpkg/bufplugin"
1924
)
2025

@@ -68,5 +73,29 @@ func (s staticPolicyPluginDataProvider) GetPluginDataProviderForPolicy(policyNam
6873
if pluginDataProvider, ok := s.policyNameToPluginDataProvider[policyName]; ok {
6974
return pluginDataProvider
7075
}
71-
return bufplugin.NopPluginDataProvider
76+
// Check if the policyName is a valid ref. If so, also check by full name.
77+
// Remote policies are cached by full name in the buf.lock file.
78+
if ref, err := bufparse.ParseRef(policyName); err == nil && ref.Ref() != "" {
79+
if pluginDataProvider, ok := s.policyNameToPluginDataProvider[ref.FullName().String()]; ok {
80+
return pluginDataProvider
81+
}
82+
}
83+
return newNopPluginDataProviderForPolicy(policyName)
84+
}
85+
86+
type nopPluginDataProviderForPolicy struct {
87+
policyName string
88+
}
89+
90+
func newNopPluginDataProviderForPolicy(policyName string) bufplugin.PluginDataProvider {
91+
return &nopPluginDataProviderForPolicy{
92+
policyName: policyName,
93+
}
94+
}
95+
96+
func (p *nopPluginDataProviderForPolicy) GetPluginDatasForPluginKeys(
97+
context.Context,
98+
[]bufplugin.PluginKey,
99+
) ([]bufplugin.PluginData, error) {
100+
return nil, fmt.Errorf("no plugins configured for policy %q: %w", p.policyName, fs.ErrNotExist)
72101
}

private/bufpkg/bufpolicy/policy_plugin_key_provider.go

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,11 @@
1515
package bufpolicy
1616

1717
import (
18+
"context"
1819
"fmt"
20+
"io/fs"
1921

22+
"github.com/bufbuild/buf/private/bufpkg/bufparse"
2023
"github.com/bufbuild/buf/private/bufpkg/bufplugin"
2124
)
2225

@@ -78,5 +81,30 @@ func (s staticPolicyPluginKeyProvider) GetPluginKeyProviderForPolicy(policyName
7881
if pluginKeyProvider, ok := s.policyNameToPluginKeyProvider[policyName]; ok {
7982
return pluginKeyProvider
8083
}
81-
return bufplugin.NopPluginKeyProvider
84+
// Check if the policyName is a valid ref. If so, also check by full name.
85+
// Remote policies are cached by full name in the buf.lock file.
86+
if ref, err := bufparse.ParseRef(policyName); err == nil && ref.Ref() != "" {
87+
if pluginKeyProvider, ok := s.policyNameToPluginKeyProvider[ref.FullName().String()]; ok {
88+
return pluginKeyProvider
89+
}
90+
}
91+
return newNopPluginKeyProviderForPolicy(policyName)
92+
}
93+
94+
type nopPluginKeyProviderForPolicy struct {
95+
policyName string
96+
}
97+
98+
func newNopPluginKeyProviderForPolicy(policyName string) bufplugin.PluginKeyProvider {
99+
return &nopPluginKeyProviderForPolicy{
100+
policyName: policyName,
101+
}
102+
}
103+
104+
func (p *nopPluginKeyProviderForPolicy) GetPluginKeysForPluginRefs(
105+
context.Context,
106+
[]bufparse.Ref,
107+
bufplugin.DigestType,
108+
) ([]bufplugin.PluginKey, error) {
109+
return nil, fmt.Errorf("no plugins configured for policy %q: %w", p.policyName, fs.ErrNotExist)
82110
}

0 commit comments

Comments
 (0)