fix yaml overrides for default skills registries
This commit is contained in:
parent
6c766fc119
commit
4da7494c7e
2 changed files with 77 additions and 30 deletions
|
|
@ -538,60 +538,74 @@ func (c SkillRegistryConfig) MarshalYAML() (any, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *SkillsRegistriesConfig) UnmarshalYAML(value *yaml.Node) error {
|
func (v *SkillsRegistriesConfig) UnmarshalYAML(value *yaml.Node) error {
|
||||||
mm := make(map[string]*SkillRegistryConfig)
|
decoded, err := decodeRegistryNodesFromYAML(value, nil)
|
||||||
if err := value.Decode(&mm); err != nil {
|
if err != nil {
|
||||||
logger.Errorf("Decode error: %v", err)
|
logger.Errorf("Decode error: %v", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if len(*v) == 0 {
|
if len(*v) == 0 {
|
||||||
keys := make([]string, 0, len(mm))
|
keys := make([]string, 0, len(decoded))
|
||||||
for name := range mm {
|
for name := range decoded {
|
||||||
keys = append(keys, name)
|
keys = append(keys, name)
|
||||||
}
|
}
|
||||||
sort.Strings(keys)
|
sort.Strings(keys)
|
||||||
list := make([]*SkillRegistryConfig, 0, len(keys))
|
list := make([]*SkillRegistryConfig, 0, len(keys))
|
||||||
for _, name := range keys {
|
for _, name := range keys {
|
||||||
registry := mm[name]
|
registry := decoded[name]
|
||||||
if registry == nil {
|
if registry == nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
registry.Name = name
|
|
||||||
list = append(list, registry)
|
list = append(list, registry)
|
||||||
}
|
}
|
||||||
*v = list
|
*v = list
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
for _, name := range sortedRegistryNames(mm) {
|
decoded, err = decodeRegistryNodesFromYAML(value, *v)
|
||||||
sec := mm[name]
|
if err != nil {
|
||||||
if sec == nil {
|
logger.Errorf("Decode error: %v", err)
|
||||||
continue
|
return err
|
||||||
}
|
}
|
||||||
sec.Name = name
|
for _, name := range sortedRegistryNames(decoded) {
|
||||||
registry := findRegistryConfigByName(*v, name)
|
registry := decoded[name]
|
||||||
if registry == nil {
|
if registry == nil {
|
||||||
*v = append(*v, cloneRegistryConfig(sec))
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
registry.AuthToken = sec.AuthToken
|
v.Set(name, *registry)
|
||||||
if registry.BaseURL == "" {
|
|
||||||
registry.BaseURL = sec.BaseURL
|
|
||||||
}
|
|
||||||
if !registry.Enabled {
|
|
||||||
registry.Enabled = sec.Enabled
|
|
||||||
}
|
|
||||||
if registry.Param == nil {
|
|
||||||
registry.Param = map[string]any{}
|
|
||||||
}
|
|
||||||
for key, value := range sec.Param {
|
|
||||||
if _, ok := registry.Param[key]; ok {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
registry.Param[key] = value
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func decodeRegistryNodesFromYAML(
|
||||||
|
value *yaml.Node,
|
||||||
|
existing SkillsRegistriesConfig,
|
||||||
|
) (map[string]*SkillRegistryConfig, error) {
|
||||||
|
decoded := make(map[string]*SkillRegistryConfig)
|
||||||
|
if value == nil {
|
||||||
|
return decoded, nil
|
||||||
|
}
|
||||||
|
for i := 0; i+1 < len(value.Content); i += 2 {
|
||||||
|
nameNode := value.Content[i]
|
||||||
|
registryNode := value.Content[i+1]
|
||||||
|
if nameNode == nil || registryNode == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
name := strings.TrimSpace(nameNode.Value)
|
||||||
|
if name == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
registry := cloneRegistryConfig(findRegistryConfigByName(existing, name))
|
||||||
|
if registry == nil {
|
||||||
|
registry = &SkillRegistryConfig{Name: name}
|
||||||
|
}
|
||||||
|
if err := registryNode.Decode(registry); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
registry.Name = name
|
||||||
|
decoded[name] = registry
|
||||||
|
}
|
||||||
|
return decoded, nil
|
||||||
|
}
|
||||||
|
|
||||||
func cloneRegistryParams(src map[string]any) map[string]any {
|
func cloneRegistryParams(src map[string]any) map[string]any {
|
||||||
if src == nil {
|
if src == nil {
|
||||||
return nil
|
return nil
|
||||||
|
|
|
||||||
|
|
@ -304,6 +304,39 @@ func TestSkillsRegistriesConfigUnmarshalYAMLAppendsNewRegistryToExistingSlice(t
|
||||||
assert.Equal(t, "https://github.com", github.BaseURL)
|
assert.Equal(t, "https://github.com", github.BaseURL)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSkillsRegistriesConfigUnmarshalYAMLOverridesDefaultRegistryFields(t *testing.T) {
|
||||||
|
registries := DefaultConfig().Tools.Skills.Registries
|
||||||
|
|
||||||
|
err := yaml.Unmarshal([]byte(`github:
|
||||||
|
enabled: false
|
||||||
|
base_url: https://ghe.example.com/git
|
||||||
|
proxy: http://127.0.0.1:7890
|
||||||
|
`), ®istries)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
github, ok := registries.Get("github")
|
||||||
|
assert.True(t, ok)
|
||||||
|
assert.False(t, github.Enabled)
|
||||||
|
assert.Equal(t, "https://ghe.example.com/git", github.BaseURL)
|
||||||
|
assert.Equal(t, "http://127.0.0.1:7890", github.Param["proxy"])
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSkillsRegistriesConfigUnmarshalYAMLRetainsDefaultsForOmittedFields(t *testing.T) {
|
||||||
|
registries := DefaultConfig().Tools.Skills.Registries
|
||||||
|
|
||||||
|
err := yaml.Unmarshal([]byte(`github:
|
||||||
|
auth_token: registry-token
|
||||||
|
`), ®istries)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
github, ok := registries.Get("github")
|
||||||
|
assert.True(t, ok)
|
||||||
|
assert.True(t, github.Enabled)
|
||||||
|
assert.Equal(t, "https://github.com", github.BaseURL)
|
||||||
|
assert.Equal(t, "registry-token", github.AuthToken.String())
|
||||||
|
assert.Empty(t, github.Param)
|
||||||
|
}
|
||||||
|
|
||||||
func TestSkillsGithubConfigV0ToSkillsGithubConfigPreservesBaseURL(t *testing.T) {
|
func TestSkillsGithubConfigV0ToSkillsGithubConfigPreservesBaseURL(t *testing.T) {
|
||||||
legacy := skillsGithubConfigV0{
|
legacy := skillsGithubConfigV0{
|
||||||
BaseURL: "https://ghe.example.com/git",
|
BaseURL: "https://ghe.example.com/git",
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue