@@ -196,9 +196,33 @@ type UnitInfo struct {
196
196
}
197
197
198
198
var (
199
+ // Key: Extension
200
+ // Value: Processing order for resource naming dependencies
201
+ SupportedExtensions = map [string ]int {
202
+ ".container" : 4 ,
203
+ ".volume" : 2 ,
204
+ ".kube" : 4 ,
205
+ ".network" : 2 ,
206
+ ".image" : 1 ,
207
+ ".build" : 3 ,
208
+ ".pod" : 5 ,
209
+ }
210
+
199
211
URL = regexp .Delayed (`^((https?)|(git)://)|(github\.com/).+$` )
200
212
validPortRange = regexp .Delayed (`\d+(-\d+)?(/udp|/tcp)?$` )
201
213
214
+ unitDependencyKeys = []string {
215
+ "Wants" ,
216
+ "Requires" ,
217
+ "Requisite" ,
218
+ "BindsTo" ,
219
+ "PartOf" ,
220
+ "Upholds" ,
221
+ "Conflicts" ,
222
+ "Before" ,
223
+ "After" ,
224
+ }
225
+
202
226
// Supported keys in "Container" group
203
227
supportedContainerKeys = map [string ]bool {
204
228
KeyAddCapability : true ,
@@ -514,6 +538,10 @@ func ConvertContainer(container *parser.UnitFile, isUser bool, unitsInfoMap map[
514
538
service := container .Dup ()
515
539
service .Filename = unitInfo .ServiceFileName ()
516
540
541
+ if err := translateUnitDependencies (service , unitsInfoMap ); err != nil {
542
+ return nil , warnings , err
543
+ }
544
+
517
545
addDefaultDependencies (service , isUser )
518
546
519
547
if container .Path != "" {
@@ -923,6 +951,10 @@ func ConvertNetwork(network *parser.UnitFile, name string, unitsInfoMap map[stri
923
951
service := network .Dup ()
924
952
service .Filename = unitInfo .ServiceFileName ()
925
953
954
+ if err := translateUnitDependencies (service , unitsInfoMap ); err != nil {
955
+ return nil , warnings , err
956
+ }
957
+
926
958
addDefaultDependencies (service , isUser )
927
959
928
960
if network .Path != "" {
@@ -1034,6 +1066,10 @@ func ConvertVolume(volume *parser.UnitFile, name string, unitsInfoMap map[string
1034
1066
service := volume .Dup ()
1035
1067
service .Filename = unitInfo .ServiceFileName ()
1036
1068
1069
+ if err := translateUnitDependencies (service , unitsInfoMap ); err != nil {
1070
+ return nil , warnings , err
1071
+ }
1072
+
1037
1073
addDefaultDependencies (service , isUser )
1038
1074
1039
1075
if volume .Path != "" {
@@ -1173,6 +1209,10 @@ func ConvertKube(kube *parser.UnitFile, unitsInfoMap map[string]*UnitInfo, isUse
1173
1209
service := kube .Dup ()
1174
1210
service .Filename = unitInfo .ServiceFileName ()
1175
1211
1212
+ if err := translateUnitDependencies (service , unitsInfoMap ); err != nil {
1213
+ return nil , err
1214
+ }
1215
+
1176
1216
addDefaultDependencies (service , isUser )
1177
1217
1178
1218
if kube .Path != "" {
@@ -1318,6 +1358,10 @@ func ConvertImage(image *parser.UnitFile, unitsInfoMap map[string]*UnitInfo, isU
1318
1358
service := image .Dup ()
1319
1359
service .Filename = unitInfo .ServiceFileName ()
1320
1360
1361
+ if err := translateUnitDependencies (service , unitsInfoMap ); err != nil {
1362
+ return nil , err
1363
+ }
1364
+
1321
1365
addDefaultDependencies (service , isUser )
1322
1366
1323
1367
if image .Path != "" {
@@ -1399,6 +1443,10 @@ func ConvertBuild(build *parser.UnitFile, unitsInfoMap map[string]*UnitInfo, isU
1399
1443
service := build .Dup ()
1400
1444
service .Filename = unitInfo .ServiceFileName ()
1401
1445
1446
+ if err := translateUnitDependencies (service , unitsInfoMap ); err != nil {
1447
+ return nil , warnings , err
1448
+ }
1449
+
1402
1450
addDefaultDependencies (service , isUser )
1403
1451
1404
1452
/* Rename old Build group to X-Build so that systemd ignores it */
@@ -1568,6 +1616,10 @@ func ConvertPod(podUnit *parser.UnitFile, name string, unitsInfoMap map[string]*
1568
1616
service := podUnit .Dup ()
1569
1617
service .Filename = unitInfo .ServiceFileName ()
1570
1618
1619
+ if err := translateUnitDependencies (service , unitsInfoMap ); err != nil {
1620
+ return nil , err
1621
+ }
1622
+
1571
1623
addDefaultDependencies (service , isUser )
1572
1624
1573
1625
if podUnit .Path != "" {
@@ -2260,3 +2312,36 @@ func handleExecReload(quadletUnitFile, serviceUnitFile *parser.UnitFile, groupNa
2260
2312
2261
2313
return nil
2262
2314
}
2315
+
2316
+ func translateUnitDependencies (serviceUnitFile * parser.UnitFile , unitsInfoMap map [string ]* UnitInfo ) error {
2317
+ for _ , unitDependencyKey := range unitDependencyKeys {
2318
+ deps := serviceUnitFile .LookupAllStrv (UnitGroup , unitDependencyKey )
2319
+ if len (deps ) == 0 {
2320
+ continue
2321
+ }
2322
+ translatedDeps := make ([]string , 0 , len (deps ))
2323
+ translated := false
2324
+ for _ , dep := range deps {
2325
+ var translatedDep string
2326
+
2327
+ ext := filepath .Ext (dep )
2328
+ if _ , ok := SupportedExtensions [ext ]; ok {
2329
+ unitInfo , ok := unitsInfoMap [dep ]
2330
+ if ! ok {
2331
+ return fmt .Errorf ("unable to translate dependency for %s" , dep )
2332
+ }
2333
+ translatedDep = unitInfo .ServiceFileName ()
2334
+ translated = true
2335
+ } else {
2336
+ translatedDep = dep
2337
+ }
2338
+ translatedDeps = append (translatedDeps , translatedDep )
2339
+ }
2340
+ if ! translated {
2341
+ continue
2342
+ }
2343
+ serviceUnitFile .Unset (UnitGroup , unitDependencyKey )
2344
+ serviceUnitFile .Add (UnitGroup , unitDependencyKey , strings .Join (translatedDeps , " " ))
2345
+ }
2346
+ return nil
2347
+ }
0 commit comments