mirror of https://github.com/containers/podman.git
quadlet: Support [Install] for templated units
For a base template like `foo@.container` the WantedBy and RequiredBy keys does nothing. However, if a DefaultInstance= key is specified that is used by default. However, even if the DefaultInstance= is not given, the Install section is still useful, because you can instantiate the generic template by making a symlink for it, and that symlink will then pick up the instance id. So, for example, this foo@.container will not enable anything on boot. ``` [Container] Image=foo Exec=sleep 100 [Install] WantedBy=other.container ``` But if you have a symlink 'foo@instance.container` -> `foo@.container' then the `foo@instance` service will be marked as wanted by `other`. In addition, even if the main template doesn't have an Install section, you can instantiate it with a symlink like above, and then enabling it using a dropin file like foo@instance.container.d/install.conf containing: ``` [Install] WantedBy=other.container ``` Signed-off-by: Alexander Larsson <alexl@redhat.com>
This commit is contained in:
parent
7e1942ed46
commit
bb6dec46ff
|
@ -345,11 +345,27 @@ func enableServiceFile(outputPath string, service *parser.UnitFile) {
|
||||||
symlinks = append(symlinks, filepath.Clean(alias))
|
symlinks = append(symlinks, filepath.Clean(alias))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
serviceFilename := service.Filename
|
||||||
|
templateBase, templateInstance := service.GetTemplateParts()
|
||||||
|
|
||||||
|
// For non-instantiated template service we only support installs if a
|
||||||
|
// DefaultInstance is given. Otherwise we ignore the Install group, but
|
||||||
|
// it is still useful when instantiating the unit via a symlink.
|
||||||
|
if templateBase != "" && templateInstance == "" {
|
||||||
|
if defaultInstance, ok := service.Lookup(quadlet.InstallGroup, "DefaultInstance"); ok {
|
||||||
|
parts := strings.SplitN(templateBase, "@", 2)
|
||||||
|
serviceFilename = parts[0] + "@" + defaultInstance + parts[1]
|
||||||
|
} else {
|
||||||
|
serviceFilename = ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if serviceFilename != "" {
|
||||||
wantedBy := service.LookupAllStrv(quadlet.InstallGroup, "WantedBy")
|
wantedBy := service.LookupAllStrv(quadlet.InstallGroup, "WantedBy")
|
||||||
for _, wantedByUnit := range wantedBy {
|
for _, wantedByUnit := range wantedBy {
|
||||||
// Only allow filenames, not paths
|
// Only allow filenames, not paths
|
||||||
if !strings.Contains(wantedByUnit, "/") {
|
if !strings.Contains(wantedByUnit, "/") {
|
||||||
symlinks = append(symlinks, fmt.Sprintf("%s.wants/%s", wantedByUnit, service.Filename))
|
symlinks = append(symlinks, fmt.Sprintf("%s.wants/%s", wantedByUnit, serviceFilename))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -357,7 +373,8 @@ func enableServiceFile(outputPath string, service *parser.UnitFile) {
|
||||||
for _, requiredByUnit := range requiredBy {
|
for _, requiredByUnit := range requiredBy {
|
||||||
// Only allow filenames, not paths
|
// Only allow filenames, not paths
|
||||||
if !strings.Contains(requiredByUnit, "/") {
|
if !strings.Contains(requiredByUnit, "/") {
|
||||||
symlinks = append(symlinks, fmt.Sprintf("%s.requires/%s", requiredByUnit, service.Filename))
|
symlinks = append(symlinks, fmt.Sprintf("%s.requires/%s", requiredByUnit, serviceFilename))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue