|
49 | 49 | defaultConfigFile = SystemConfigFile
|
50 | 50 | // DefaultStoreOptions is a reasonable default set of options.
|
51 | 51 | defaultStoreOptions StoreOptions
|
| 52 | + |
| 53 | + // defaultOverrideConfigFile path to override the default system wide storage.conf file |
| 54 | + defaultOverrideConfigFile = "/etc/containers/storage.conf" |
| 55 | + |
| 56 | + // defaultDropInConfigDir path to the folder containing drop in config files |
| 57 | + defaultDropInConfigDir = "/etc/containers/storage.conf.d" |
52 | 58 | )
|
53 | 59 |
|
54 | 60 | func loadDefaultStoreOptions() {
|
@@ -114,11 +120,101 @@ func loadDefaultStoreOptions() {
|
114 | 120 |
|
115 | 121 | // loadStoreOptions returns the default storage ops for containers
|
116 | 122 | func loadStoreOptions() (StoreOptions, error) {
|
117 |
| - storageConf, err := DefaultConfigFile() |
| 123 | + baseConf, err := DefaultConfigFile() |
| 124 | + if err != nil { |
| 125 | + return defaultStoreOptions, err |
| 126 | + } |
| 127 | + |
| 128 | + // Load the base config file |
| 129 | + baseOptions, err := loadStoreOptionsFromConfFile(baseConf) |
| 130 | + if err != nil { |
| 131 | + return defaultStoreOptions, err |
| 132 | + } |
| 133 | + |
| 134 | + if _, err := os.Stat(defaultDropInConfigDir); err != nil && os.IsNotExist(err) { |
| 135 | + return defaultStoreOptions, err |
| 136 | + } |
| 137 | + |
| 138 | + baseOptions, err = mergeConfigFromDirectory(baseOptions, defaultDropInConfigDir) |
118 | 139 | if err != nil {
|
119 | 140 | return defaultStoreOptions, err
|
120 | 141 | }
|
121 |
| - return loadStoreOptionsFromConfFile(storageConf) |
| 142 | + |
| 143 | + return baseOptions, nil |
| 144 | +} |
| 145 | + |
| 146 | +func mergeConfigFromDirectory(baseOptions StoreOptions, configDir string) (StoreOptions, error) { |
| 147 | + err := filepath.Walk(configDir, func(path string, info os.FileInfo, err error) error { |
| 148 | + if err != nil { |
| 149 | + return err |
| 150 | + } |
| 151 | + if info.IsDir() { |
| 152 | + return nil |
| 153 | + } |
| 154 | + |
| 155 | + // Load drop-in options from the current file |
| 156 | + dropInOptions, err := loadStoreOptionsFromConfFile(path) |
| 157 | + if err != nil { |
| 158 | + return err |
| 159 | + } |
| 160 | + |
| 161 | + // Merge the drop-in options into the base options |
| 162 | + baseOptions = mergeStoreOptions(baseOptions, dropInOptions) |
| 163 | + return nil |
| 164 | + }) |
| 165 | + if err != nil { |
| 166 | + return baseOptions, err |
| 167 | + } |
| 168 | + return baseOptions, nil |
| 169 | +} |
| 170 | + |
| 171 | +func mergeStoreOptions(base, dropIn StoreOptions) StoreOptions { |
| 172 | + if dropIn.RunRoot != "" { |
| 173 | + base.RunRoot = dropIn.RunRoot |
| 174 | + } |
| 175 | + if dropIn.GraphRoot != "" { |
| 176 | + base.GraphRoot = dropIn.GraphRoot |
| 177 | + } |
| 178 | + if dropIn.ImageStore != "" { |
| 179 | + base.ImageStore = dropIn.ImageStore |
| 180 | + } |
| 181 | + if dropIn.RootlessStoragePath != "" { |
| 182 | + base.RootlessStoragePath = dropIn.RootlessStoragePath |
| 183 | + } |
| 184 | + if dropIn.GraphDriverName != "" { |
| 185 | + base.GraphDriverName = dropIn.GraphDriverName |
| 186 | + } |
| 187 | + if dropIn.RootAutoNsUser != "" { |
| 188 | + base.RootAutoNsUser = dropIn.RootAutoNsUser |
| 189 | + } |
| 190 | + |
| 191 | + base.GraphDriverPriority = appendUniqueStrings(base.GraphDriverPriority, dropIn.GraphDriverPriority) |
| 192 | + base.GraphDriverOptions = appendUniqueStrings(base.GraphDriverOptions, dropIn.GraphDriverOptions) |
| 193 | + base.UIDMap = appendUniqueIDMaps(base.UIDMap, dropIn.UIDMap) |
| 194 | + base.GIDMap = appendUniqueIDMaps(base.GIDMap, dropIn.GIDMap) |
| 195 | + |
| 196 | + // For map fields, simply merge the key-value pairs. |
| 197 | + for key, value := range dropIn.PullOptions { |
| 198 | + base.PullOptions[key] = value |
| 199 | + } |
| 200 | + |
| 201 | + // For boolean fields, use the drop-in value if it changes the default (assumed false). |
| 202 | + if dropIn.DisableVolatile { |
| 203 | + base.DisableVolatile = dropIn.DisableVolatile |
| 204 | + } |
| 205 | + if dropIn.TransientStore { |
| 206 | + base.TransientStore = dropIn.TransientStore |
| 207 | + } |
| 208 | + |
| 209 | + // For numeric fields, use non-zero values from drop-in. |
| 210 | + if dropIn.AutoNsMinSize != 0 { |
| 211 | + base.AutoNsMinSize = dropIn.AutoNsMinSize |
| 212 | + } |
| 213 | + if dropIn.AutoNsMaxSize != 0 { |
| 214 | + base.AutoNsMaxSize = dropIn.AutoNsMaxSize |
| 215 | + } |
| 216 | + |
| 217 | + return base |
122 | 218 | }
|
123 | 219 |
|
124 | 220 | // usePerUserStorage returns whether the user private storage must be used.
|
|
0 commit comments