mirror of
https://gitea.elkins.co/Networking/ccl.git
synced 2025-03-09 12:41:40 -05:00
Any container definitions in ccl.toml can be given a `start_order` tag (integer). It is recommended to not put a start_order unless a container depends on another one (e.g. synapse needs postgres), in which case all dependents and dependees should be given a `start_order`, with dependees having a lower number than their dependents. It is guaranteed that the dependees will be started first, although the container startup procedure is outside of our control. Containers without a `start_order` will have their operations applied asynchronously, but those with a start order are started, well, in order from lowest to highest. "Stop" operations are applied in the reverse order.
62 lines
1.8 KiB
Go
62 lines
1.8 KiB
Go
/*
|
|
Copyright © 2022 Joel D. Elkins <joel@elkins.co>
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
in the Software without restriction, including without limitation the rights
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
all copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
THE SOFTWARE.
|
|
*/
|
|
|
|
package container
|
|
|
|
import "golang.org/x/exp/slices"
|
|
|
|
type operation bool
|
|
|
|
const (
|
|
Start operation = true
|
|
Stop operation = false
|
|
)
|
|
|
|
func Reorder(conts []Container, op operation) {
|
|
// null orderings go first for either start or stop, as they are executed asynchronously
|
|
norm := func(a, b Container) bool {
|
|
if !a.StartOrder.Valid {
|
|
return true
|
|
}
|
|
if !b.StartOrder.Valid {
|
|
return false
|
|
}
|
|
return a.StartOrder.ValueOrZero() < b.StartOrder.ValueOrZero()
|
|
}
|
|
rev := func(a, b Container) bool {
|
|
if !a.StartOrder.Valid {
|
|
return true
|
|
}
|
|
if !b.StartOrder.Valid {
|
|
return false
|
|
}
|
|
return b.StartOrder.ValueOrZero() > a.StartOrder.ValueOrZero()
|
|
}
|
|
var sorter func(a, b Container) bool
|
|
if op == Start {
|
|
sorter = norm
|
|
} else {
|
|
sorter = rev
|
|
}
|
|
slices.SortFunc(conts, sorter)
|
|
}
|