@@ -197,9 +197,33 @@ type UnitInfo struct {
197
197
}
198
198
199
199
var (
200
+ // Key: Extension
201
+ // Value: Processing order for resource naming dependencies
202
+ SupportedExtensions = map [string ]int {
203
+ ".container" : 4 ,
204
+ ".volume" : 2 ,
205
+ ".kube" : 4 ,
206
+ ".network" : 2 ,
207
+ ".image" : 1 ,
208
+ ".build" : 3 ,
209
+ ".pod" : 5 ,
210
+ }
211
+
200
212
URL = regexp .Delayed (`^((https?)|(git)://)|(github\.com/).+$` )
201
213
validPortRange = regexp .Delayed (`\d+(-\d+)?(/udp|/tcp)?$` )
202
214
215
+ unitDependencyKeys = []string {
216
+ "Wants" ,
217
+ "Requires" ,
218
+ "Requisite" ,
219
+ "BindsTo" ,
220
+ "PartOf" ,
221
+ "Upholds" ,
222
+ "Conflicts" ,
223
+ "Before" ,
224
+ "After" ,
225
+ }
226
+
203
227
// Supported keys in "Container" group
204
228
supportedContainerKeys = map [string ]bool {
205
229
KeyAddCapability : true ,
@@ -516,6 +540,10 @@ func ConvertContainer(container *parser.UnitFile, isUser bool, unitsInfoMap map[
516
540
service := container .Dup ()
517
541
service .Filename = unitInfo .ServiceFileName ()
518
542
543
+ if err := translateUnitDependencies (service , unitsInfoMap ); err != nil {
544
+ return nil , warnings , err
545
+ }
546
+
519
547
addDefaultDependencies (service , isUser )
520
548
521
549
if container .Path != "" {
@@ -925,6 +953,10 @@ func ConvertNetwork(network *parser.UnitFile, name string, unitsInfoMap map[stri
925
953
service := network .Dup ()
926
954
service .Filename = unitInfo .ServiceFileName ()
927
955
956
+ if err := translateUnitDependencies (service , unitsInfoMap ); err != nil {
957
+ return nil , warnings , err
958
+ }
959
+
928
960
addDefaultDependencies (service , isUser )
929
961
930
962
if network .Path != "" {
@@ -1042,6 +1074,10 @@ func ConvertVolume(volume *parser.UnitFile, name string, unitsInfoMap map[string
1042
1074
service := volume .Dup ()
1043
1075
service .Filename = unitInfo .ServiceFileName ()
1044
1076
1077
+ if err := translateUnitDependencies (service , unitsInfoMap ); err != nil {
1078
+ return nil , warnings , err
1079
+ }
1080
+
1045
1081
addDefaultDependencies (service , isUser )
1046
1082
1047
1083
if volume .Path != "" {
@@ -1181,6 +1217,10 @@ func ConvertKube(kube *parser.UnitFile, unitsInfoMap map[string]*UnitInfo, isUse
1181
1217
service := kube .Dup ()
1182
1218
service .Filename = unitInfo .ServiceFileName ()
1183
1219
1220
+ if err := translateUnitDependencies (service , unitsInfoMap ); err != nil {
1221
+ return nil , err
1222
+ }
1223
+
1184
1224
addDefaultDependencies (service , isUser )
1185
1225
1186
1226
if kube .Path != "" {
@@ -1326,6 +1366,10 @@ func ConvertImage(image *parser.UnitFile, unitsInfoMap map[string]*UnitInfo, isU
1326
1366
service := image .Dup ()
1327
1367
service .Filename = unitInfo .ServiceFileName ()
1328
1368
1369
+ if err := translateUnitDependencies (service , unitsInfoMap ); err != nil {
1370
+ return nil , err
1371
+ }
1372
+
1329
1373
addDefaultDependencies (service , isUser )
1330
1374
1331
1375
if image .Path != "" {
@@ -1407,6 +1451,10 @@ func ConvertBuild(build *parser.UnitFile, unitsInfoMap map[string]*UnitInfo, isU
1407
1451
service := build .Dup ()
1408
1452
service .Filename = unitInfo .ServiceFileName ()
1409
1453
1454
+ if err := translateUnitDependencies (service , unitsInfoMap ); err != nil {
1455
+ return nil , warnings , err
1456
+ }
1457
+
1410
1458
addDefaultDependencies (service , isUser )
1411
1459
1412
1460
/* Rename old Build group to X-Build so that systemd ignores it */
@@ -1576,6 +1624,10 @@ func ConvertPod(podUnit *parser.UnitFile, name string, unitsInfoMap map[string]*
1576
1624
service := podUnit .Dup ()
1577
1625
service .Filename = unitInfo .ServiceFileName ()
1578
1626
1627
+ if err := translateUnitDependencies (service , unitsInfoMap ); err != nil {
1628
+ return nil , err
1629
+ }
1630
+
1579
1631
addDefaultDependencies (service , isUser )
1580
1632
1581
1633
if podUnit .Path != "" {
@@ -2268,3 +2320,36 @@ func handleExecReload(quadletUnitFile, serviceUnitFile *parser.UnitFile, groupNa
2268
2320
2269
2321
return nil
2270
2322
}
2323
+
2324
+ func translateUnitDependencies (serviceUnitFile * parser.UnitFile , unitsInfoMap map [string ]* UnitInfo ) error {
2325
+ for _ , unitDependencyKey := range unitDependencyKeys {
2326
+ deps := serviceUnitFile .LookupAllStrv (UnitGroup , unitDependencyKey )
2327
+ if len (deps ) == 0 {
2328
+ continue
2329
+ }
2330
+ translatedDeps := make ([]string , 0 , len (deps ))
2331
+ translated := false
2332
+ for _ , dep := range deps {
2333
+ var translatedDep string
2334
+
2335
+ ext := filepath .Ext (dep )
2336
+ if _ , ok := SupportedExtensions [ext ]; ok {
2337
+ unitInfo , ok := unitsInfoMap [dep ]
2338
+ if ! ok {
2339
+ return fmt .Errorf ("unable to translate dependency for %s" , dep )
2340
+ }
2341
+ translatedDep = unitInfo .ServiceFileName ()
2342
+ translated = true
2343
+ } else {
2344
+ translatedDep = dep
2345
+ }
2346
+ translatedDeps = append (translatedDeps , translatedDep )
2347
+ }
2348
+ if ! translated {
2349
+ continue
2350
+ }
2351
+ serviceUnitFile .Unset (UnitGroup , unitDependencyKey )
2352
+ serviceUnitFile .Add (UnitGroup , unitDependencyKey , strings .Join (translatedDeps , " " ))
2353
+ }
2354
+ return nil
2355
+ }
0 commit comments