MCPcopy
hub / github.com/lxc/incus / InstancePlacementRun

Function InstancePlacementRun

internal/server/scriptlet/instance_placement.go:25–519  ·  view source on GitHub ↗

InstancePlacementRun runs the instance placement scriptlet and returns the chosen cluster member target.

(ctx context.Context, l logger.Logger, s *state.State, req *apiScriptlet.InstancePlacement, candidateMembers []db.NodeInfo, leaderAddress string)

Source from the content-addressed store, hash-verified

23
24// InstancePlacementRun runs the instance placement scriptlet and returns the chosen cluster member target.
25func InstancePlacementRun(ctx context.Context, l logger.Logger, s *state.State, req *apiScriptlet.InstancePlacement, candidateMembers []db.NodeInfo, leaderAddress string) (*db.NodeInfo, error) {
26 ctx, cancel := context.WithCancel(ctx)
27 defer cancel()
28
29 logFunc := log.CreateLogger(l, "Instance placement scriptlet")
30
31 var targetMember *db.NodeInfo
32
33 setTargetFunc := func(thread *starlark.Thread, b *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) {
34 var memberName string
35
36 err := starlark.UnpackArgs(b.Name(), args, kwargs, "member_name", &memberName)
37 if err != nil {
38 return nil, err
39 }
40
41 for i := range candidateMembers {
42 if candidateMembers[i].Name == memberName {
43 targetMember = &candidateMembers[i]
44 break
45 }
46 }
47
48 if targetMember == nil {
49 l.Error("Instance placement scriptlet set invalid member target", logger.Ctx{"member": memberName})
50 return nil, fmt.Errorf("Invalid member name: %s", memberName)
51 }
52
53 l.Info("Instance placement scriptlet set member target", logger.Ctx{"member": targetMember.Name})
54
55 return starlark.None, nil
56 }
57
58 getClusterMemberResourcesFunc := func(thread *starlark.Thread, b *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) {
59 var memberName string
60
61 err := starlark.UnpackArgs(b.Name(), args, kwargs, "member_name", &memberName)
62 if err != nil {
63 return nil, err
64 }
65
66 var res *api.Resources
67
68 // Get the local resource usage.
69 if memberName == s.ServerName {
70 res, err = resources.GetResources()
71 if err != nil {
72 return nil, err
73 }
74 } else {
75 // Get remote member resource usage.
76 var targetMember *db.NodeInfo
77 for i := range candidateMembers {
78 if candidateMembers[i].Name == memberName {
79 targetMember = &candidateMembers[i]
80 break
81 }
82 }

Callers

nothing calls this directly

Calls 15

CreateLoggerFunction · 0.92
GetResourcesFunction · 0.92
StarlarkMarshalFunction · 0.92
ErrorfMethod · 0.80
ServerCertMethod · 0.80
TxMethod · 0.80
GetInstancesCountMethod · 0.80
GetNodesMethod · 0.80
GetCandidateMembersMethod · 0.80
OfflineThresholdMethod · 0.80
GetRaftNodesMethod · 0.80

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…