package host import ( "context" "github.com/carlosframework/platform/internal/hostguard" "github.com/carlosframework/platform/internal/instancectl" "github.com/carlosframework/platform/internal/release" "os" ) func claimLaunchPlacement(units ClaimLaunchUnits, host string) (string, string, error) { if bound, ok := units.(interface { Placement(string) (string, string, error) }); ok { return bound.Placement(host) } return instancectl.UnitName(instancectl.RoleRun, host), instancectl.ClaimUnitControlGroup(host), nil } func claimStopInvocation(ctx context.Context, units ClaimLaunchUnits, host, invocation string) error { if exact, ok := units.(interface { StopInvocation(context.Context, string, string) error }); ok { return exact.StopInvocation(ctx, host, invocation) } return units.Stop(ctx, host) } func generationBindingGroup(b release.GenerationBinding) string { if b.Unit == "" { return instancectl.ClaimUnitControlGroup(b.Binding.Host) } if !instancectl.ValidBoundClaimUnit(b.Unit) { return "" } return instancectl.BoundClaimUnitControlGroup(b.Binding.Host, b.Unit) } func (h *ClaimLaunchRoot) checkUnitBinding(ctx context.Context, t hostguard.FenceTarget, cleanup bool) error { unit, _, err := claimLaunchPlacement(h.Units, t.Host) if err != nil { return err } if unit == instancectl.UnitName(instancectl.RoleRun, t.Host) { return nil } if h.unitBindings == nil { return os.ErrPermission } var b claimUnitBinding if cleanup { b, err = h.unitBindings.read(t.Host) } else { b, err = h.unitBindings.check(ctx, t.Host, nil) } if err != nil { return err } if b.Owner.Host != t.Host || b.Owner.Incarnation != t.Incarnation || b.Owner.Stamp != t.Stamp || b.Owner.Box != t.Box || b.Owner.Enrollment != t.Enrollment || b.Shape.Unit != unit { return os.ErrPermission } return nil }