diff --git a/cli/compose/loader/loader.go b/cli/compose/loader/loader.go index a1a6ed0a12..378e8d0ed5 100644 --- a/cli/compose/loader/loader.go +++ b/cli/compose/loader/loader.go @@ -112,14 +112,14 @@ func loadSections(config map[string]interface{}, configDetails types.ConfigDetai { key: "secrets", fnc: func(config map[string]interface{}) error { - cfg.Secrets, err = LoadSecrets(config, configDetails.WorkingDir) + cfg.Secrets, err = LoadSecrets(config, configDetails) return err }, }, { key: "configs", fnc: func(config map[string]interface{}) error { - cfg.Configs, err = LoadConfigObjs(config, configDetails.WorkingDir) + cfg.Configs, err = LoadConfigObjs(config, configDetails) return err }, }, @@ -484,42 +484,48 @@ func LoadVolumes(source map[string]interface{}, version string) (map[string]type // LoadSecrets produces a SecretConfig map from a compose file Dict // the source Dict is not validated if directly used. Use Load() to enable validation -func LoadSecrets(source map[string]interface{}, workingDir string) (map[string]types.SecretConfig, error) { +func LoadSecrets(source map[string]interface{}, details types.ConfigDetails) (map[string]types.SecretConfig, error) { secrets := make(map[string]types.SecretConfig) if err := transform(source, &secrets); err != nil { return secrets, err } for name, secret := range secrets { - if secret.External.External && secret.External.Name == "" { - secret.External.Name = name - secrets[name] = secret - } - if secret.File != "" { - secret.File = absPath(workingDir, secret.File) + obj, err := loadFileObjectConfig(name, types.FileObjectConfig(secret), details) + if err != nil { + return nil, err } + secrets[name] = types.SecretConfig(obj) } return secrets, nil } // LoadConfigObjs produces a ConfigObjConfig map from a compose file Dict // the source Dict is not validated if directly used. Use Load() to enable validation -func LoadConfigObjs(source map[string]interface{}, workingDir string) (map[string]types.ConfigObjConfig, error) { +func LoadConfigObjs(source map[string]interface{}, details types.ConfigDetails) (map[string]types.ConfigObjConfig, error) { configs := make(map[string]types.ConfigObjConfig) if err := transform(source, &configs); err != nil { return configs, err } for name, config := range configs { - if config.External.External && config.External.Name == "" { - config.External.Name = name - configs[name] = config - } - if config.File != "" { - config.File = absPath(workingDir, config.File) + obj, err := loadFileObjectConfig(name, types.FileObjectConfig(config), details) + if err != nil { + return nil, err } + configs[name] = types.ConfigObjConfig(obj) } return configs, nil } +func loadFileObjectConfig(name string, obj types.FileObjectConfig, details types.ConfigDetails) (types.FileObjectConfig, error) { + if obj.External.External && obj.External.Name == "" { + obj.External.Name = name + } + if obj.File != "" { + obj.File = absPath(details.WorkingDir, obj.File) + } + return obj, nil +} + func absPath(workingDir string, filePath string) string { if filepath.IsAbs(filePath) { return filePath diff --git a/cli/compose/types/types.go b/cli/compose/types/types.go index b5afc9b241..4e68da08ae 100644 --- a/cli/compose/types/types.go +++ b/cli/compose/types/types.go @@ -344,14 +344,15 @@ type CredentialSpecConfig struct { Registry string } -type fileObjectConfig struct { +// FileObjectConfig is a config type for a file used by a service +type FileObjectConfig struct { File string External External Labels Labels } // SecretConfig for a secret -type SecretConfig fileObjectConfig +type SecretConfig FileObjectConfig // ConfigObjConfig is the config for the swarm "Config" object -type ConfigObjConfig fileObjectConfig +type ConfigObjConfig FileObjectConfig