1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package bidder
import (
"context"
"fmt"
"slices"
"github.com/johnandersen777/socialweb-computer-kcp/api/v1alpha1"
"github.com/johnandersen777/socialweb-computer-kcp/internal/atproto/market"
"github.com/johnandersen777/socialweb-computer-kcp/internal/guestseed"
)
var ErrKindUnsupported = fmt.Errorf("bidder: the RFP asks for a compute kind this bidder does not serve")
func (b *Bidder) servesKind(kind string) bool {
served := b.cfg.ComputeKinds
if len(served) == 0 {
served = []string{string(v1alpha1.ComputeKindVM)}
}
if kind == "" {
kind = string(v1alpha1.ComputeKindVM)
}
if !slices.Contains(served, kind) {
return false
}
if kind == string(v1alpha1.ComputeKindDeno) && (b.cfg.Sandbox == nil || !b.cfg.Sandbox.Available()) {
return false
}
return true
}
func (b *Bidder) rfpKind(ctx context.Context, rfpURI, rfpCID string) (string, error) {
resolved, err := b.records.Resolve(ctx, market.RecordRef{URI: rfpURI, CID: rfpCID})
if err != nil {
return "", fmt.Errorf("bidder: resolving the RFP payload kind: %w", err)
}
rfp, err := market.ParseRFP(resolved.Value)
if err != nil {
return "", nil
}
payload, err := b.records.Resolve(ctx, market.RecordRef{URI: rfp.Payload.URI, CID: rfp.Payload.CID})
if err != nil {
return "", fmt.Errorf("bidder: resolving the RFP payload: %w", err)
}
kind, _ := payload.Value["kind"].(string)
return kind, nil
}
func (b *Bidder) inboxServesKind(ctx context.Context, rfpURI, rfpCID string) (string, bool) {
kind, err := b.rfpKind(ctx, rfpURI, rfpCID)
if err != nil {
b.log.Warn("reading the compute kind of an inbox RFP failed; it is dropped", "rfp", rfpURI, "err", err.Error())
return kind, false
}
return kind, b.servesKind(kind)
}
func (b *Bidder) guestToolsRefused(ctx context.Context, rfp *market.RFP) (string, error) {
payload, err := b.records.Resolve(ctx, market.RecordRef{URI: rfp.Payload.URI, CID: rfp.Payload.CID})
if err != nil {
return "", fmt.Errorf("bidder: resolving the RFP payload for its guest tools: %w", err)
}
userData, _ := payload.Value["user_data"].(string)
needs := guestseed.GuestBinariesNeeded(userData)
if len(needs.Tools) == 0 {
return "", nil
}
if err := needs.ToolsErr(); err != nil {
return err.Error(), nil
}
if _, err := guestseed.GuestBinaryPins(b.cfg.GuestDownloads, needs.Tools); err != nil {
return err.Error(), nil
}
return "", nil
}