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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package bidder
import (
commonv1 "github.com/johnandersen777/socialweb-computer-kcp/api/common/v1alpha1"
"github.com/johnandersen777/socialweb-computer-kcp/api/v1alpha1"
"github.com/johnandersen777/socialweb-computer-kcp/internal/computevm"
"github.com/johnandersen777/socialweb-computer-kcp/internal/guestidentity"
core "github.com/johnandersen777/socialweb-computer-kcp/internal/market/bidder"
)
type guests struct{}
var _ core.Guests = guests{}
func (guests) AcceptKey(uri, cid string) string {
return computevm.AcceptRef{URI: uri, CID: cid}.Key()
}
func (guests) AcceptKeyOf(vm *v1alpha1.ComputeVM) string { return computevm.AcceptKeyOf(vm) }
func (guests) Ended(vm *v1alpha1.ComputeVM) bool { return computevm.Ended(vm) }
func (guests) Releasing(vm *v1alpha1.ComputeVM) bool { return computevm.Releasing(vm) }
func (guests) ReleaseRequested(vm *v1alpha1.ComputeVM) bool { return computevm.ReleaseRequested(vm) }
func (guests) ReleaseRequestRef(vm *v1alpha1.ComputeVM) *commonv1.StrongRef {
return computevm.ReleaseRequestRef(vm)
}
func (guests) GuestReport(vm *v1alpha1.ComputeVM) *v1alpha1.ComputeVMGuestReport {
return computevm.GuestReportOf(vm)
}
func (guests) Published(vm *v1alpha1.ComputeVM) *v1alpha1.ComputeVMPublished {
return computevm.PublishedOf(vm)
}
func (guests) ComputeVM(in core.GuestVM) (*v1alpha1.ComputeVM, error) {
input := computevm.VMInput{
Name: in.Name,
Handle: in.Handle,
VM: in.Shape,
RequesterDID: in.RequesterDID,
Vault: computevm.GuestVaultRef{Server: in.VaultServer, Mount: in.VaultMount},
StopGraceSeconds: in.StopGraceSeconds,
GuestLogin: in.Login,
HostPorts: in.HostPorts,
LANUDP: in.LANUDP,
HostUDP: in.HostUDP,
WebRTCUDPPort: in.WebRTCUDPPort,
Owner: in.Owner,
}
if in.Accept.URI != "" || in.Accept.CID != "" {
input.Accept = &computevm.AcceptRef{URI: in.Accept.URI, CID: in.Accept.CID}
}
return computevm.ComputeVMFor(input)
}
func (guests) UserData(name, userData string) (string, map[string]any) {
return computevm.UserDataPath(name), computevm.UserDataEntry(userData)
}
func (guests) LoginSecret(acceptKey string) (string, string, error) {
if acceptKey == "" {
return computevm.GuestLoginSecret()
}
secret, hash := computevm.GuestLoginSecretFor(acceptKey)
return secret, hash, nil
}
func (guests) Audience(name string) string {
return guestidentity.GuestAudience(guestidentity.KCPAPI, name)
}
func (guests) Grant(bidderDID, requesterDID, role, name string) (v1alpha1.GuestIdentityGrant, error) {
subject, err := guestidentity.SubjectFor(bidderDID, requesterDID, role)
if err != nil {
return v1alpha1.GuestIdentityGrant{}, err
}
return guestidentity.GrantFor(guestidentity.GrantSubject{ComputeVM: name, RequesterDID: requesterDID, Subject: subject},
guestidentity.OwnWish(name)), nil
}
func (guests) BidConfig(issuerURL, bidderDID, acceptPath, createdAt string) (string, any, error) {
config, err := guestidentity.BidConfigFor(issuerURL, bidderDID, acceptPath, createdAt)
return guestidentity.WIFSimpleNSID, config, err
}
func (guests) Termination(vm *v1alpha1.ComputeVM, workspace, reason, observedAt string, request *commonv1.StrongRef) (v1alpha1.StateSync, error) {
object, err := computevm.TerminationStateSync(vm, workspace, reason, observedAt, request)
if err != nil {
return v1alpha1.StateSync{}, err
}
return *object, nil
}
func (guests) EventAdapter() string { return computevm.TerminationSyncAdapter }
func (guests) SyncLabels(vm *v1alpha1.ComputeVM) map[string]string {
return map[string]string{
computevm.TerminationSyncSourceLabel: computevm.TerminationSyncSource,
computevm.TerminationSyncUIDLabel: string(vm.UID),
computevm.TerminationSyncVMNameLabel: vm.Name,
}
}
func (guests) SyncVM(sync *v1alpha1.StateSync) string {
return sync.Labels[computevm.TerminationSyncVMNameLabel]
}
func (guests) CheckGuestEvent(record map[string]any) (string, error) {
return guestidentity.CheckGuestEvent(record)
}
func (guests) NetworkKind(tag, address string) string {
return guestidentity.NetworkKind(tag, address)
}