Merge ~cgrabowski/maas:rpc_client_server into maas:rack_region_exploration

Proposed by Christian Grabowski
Status: Merged
Approved by: Christian Grabowski
Approved revision: e4105e0c6bf7c8b11fa71629d67385c20b5a2cad
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~cgrabowski/maas:rpc_client_server
Merge into: maas:rack_region_exploration
Diff against target: 3110 lines (+2887/-3)
21 files modified
src/rackd_spike/Makefile (+21/-1)
src/rackd_spike/cmd/rackd.go (+21/-0)
src/rackd_spike/go.mod (+4/-0)
src/rackd_spike/go.sum (+15/-2)
src/rackd_spike/internal/machine_helpers/env.go (+67/-0)
src/rackd_spike/internal/machine_helpers/info.go (+24/-0)
src/rackd_spike/internal/machine_helpers/interfaces.go (+498/-0)
src/rackd_spike/internal/machine_helpers/interfaces_capnp.go (+65/-0)
src/rackd_spike/internal/machine_helpers/interfaces_test.go (+81/-0)
src/rackd_spike/internal/machine_helpers/ps.go (+81/-0)
src/rackd_spike/internal/machine_helpers/refresh.go (+29/-0)
src/rackd_spike/internal/machine_helpers/snap.go (+30/-0)
src/rackd_spike/internal/transport/rpc.go (+127/-0)
src/rackd_spike/pkg/authenticate/authenticator.go (+93/-0)
src/rackd_spike/pkg/region/handshake.go (+91/-0)
src/rackd_spike/pkg/register/registerer.go (+125/-0)
src/rackd_spike/pkg/rpc/handshake.capnp.go (+933/-0)
src/rackd_spike/pkg/rpc/network.capnp.go (+489/-0)
src/rpc/go.capnp (+27/-0)
src/rpc/handshake.capnp (+36/-0)
src/rpc/network.capnp (+30/-0)
Reviewer Review Type Date Requested Status
Alexsander de Souza Approve
MAAS Lander Approve
Review via email: mp+405247@code.launchpad.net

Commit message

add rpc handshake

add machine helper functions

To post a comment you must log in.
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b rpc_client_server lp:~cgrabowski/maas/+git/maas into -b rack_region_exploration lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: b8a28beb8353fa66ac5a4d5130940e457ccd5ed9

review: Approve
Revision history for this message
Alexsander de Souza (alexsander-souza) :
Revision history for this message
Christian Grabowski (cgrabowski) :
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b rpc_client_server lp:~cgrabowski/maas/+git/maas into -b rack_region_exploration lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 55db9bddb0a716d1a24be429bdd4750027740736

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b rpc_client_server lp:~cgrabowski/maas/+git/maas into -b rack_region_exploration lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci.internal:8080/job/maas/job/branch-tester/10399/console
COMMIT: 6b7bb3239a1fa1687c37b5a93587fddb06a009a9

review: Needs Fixing
Revision history for this message
Alexsander de Souza (alexsander-souza) :
Revision history for this message
Christian Grabowski (cgrabowski) :
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b rpc_client_server lp:~cgrabowski/maas/+git/maas into -b rack_region_exploration lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: efa4abdd774328b4e09c27e4404f5981eeff08cf

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b rpc_client_server lp:~cgrabowski/maas/+git/maas into -b rack_region_exploration lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: bd874202dee2eeed333cc3c647b3b8c4873608c2

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b rpc_client_server lp:~cgrabowski/maas/+git/maas into -b rack_region_exploration lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci.internal:8080/job/maas/job/branch-tester/10417/console
COMMIT: a350ebb73dc98f908746aa767362b4525ad8b712

review: Needs Fixing
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b rpc_client_server lp:~cgrabowski/maas/+git/maas into -b rack_region_exploration lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: e4105e0c6bf7c8b11fa71629d67385c20b5a2cad

review: Approve
Revision history for this message
Alexsander de Souza (alexsander-souza) wrote :

LGTM

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :

LANDING
-b rpc_client_server lp:~cgrabowski/maas/+git/maas into -b rack_region_exploration lp:~maas-committers/maas

STATUS: FAILED BUILD
LOG: http://maas-ci.internal:8080/job/maas/job/branch-tester/10425/consoleText

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/src/rackd_spike/Makefile b/src/rackd_spike/Makefile
index 81278c8..df50bdd 100644
--- a/src/rackd_spike/Makefile
+++ b/src/rackd_spike/Makefile
@@ -1,3 +1,6 @@
1PWD:=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
2ROOT_DIR:=$(shell dirname $(PWD))
3RPC_DIR:=$(PWD)/pkg/rpc
1VERSION:=develop-$(shell git rev-list -1 HEAD)4VERSION:=develop-$(shell git rev-list -1 HEAD)
25
3PATH:=$(shell go env GOPATH)/bin:${PATH}6PATH:=$(shell go env GOPATH)/bin:${PATH}
@@ -5,24 +8,41 @@ export PATH
58
6LDFLAGS="-X main.Version=$(VERSION) -s -w"9LDFLAGS="-X main.Version=$(VERSION) -s -w"
710
11.PHONY: all
8all: version test build12all: version test build
913
10version:14version:
11 @go version15 @go version
1216
17.PHONY: build
13build: rackd18build: rackd
1419
20.PHONY: build-dir
15build-dir:21build-dir:
16 mkdir -p ./build22 mkdir -p ./build
1723
18rackd: build-dir24.PHONY: rackd
25rackd: build-dir gen-capnp
19 go build -ldflags $(LDFLAGS) -o ./build/rackd ./cmd/rackd.go26 go build -ldflags $(LDFLAGS) -o ./build/rackd ./cmd/rackd.go
2027
28.PHONY: test
21test:29test:
22 go test ./...30 go test ./...
2331
32.PHONY: lint
24lint:33lint:
25 go vet ./...34 go vet ./...
2635
36.PHONY: format
27format:37format:
28 gofmt -s -d ./cmd ./internal ./pkg38 gofmt -s -d ./cmd ./internal ./pkg
39
40.PHONY: capnp-dir
41capnp-dir:
42 mkdir -p ./pkg/rpc
43
44%.capnp: capnp-dir
45 capnp compile -ogo:$(PWD)/pkg/rpc $(ROOT_DIR)/rpc/$@ --src-prefix $(ROOT_DIR)/rpc
46
47.PHONY: gen-capnp
48gen-capnp: handshake.capnp network.capnp
diff --git a/src/rackd_spike/cmd/rackd.go b/src/rackd_spike/cmd/rackd.go
index fd7dac5..8ca5188 100644
--- a/src/rackd_spike/cmd/rackd.go
+++ b/src/rackd_spike/cmd/rackd.go
@@ -14,6 +14,10 @@ import (
14 "rackd/cmd/subcommands"14 "rackd/cmd/subcommands"
15 "rackd/internal/config"15 "rackd/internal/config"
16 "rackd/internal/metrics"16 "rackd/internal/metrics"
17 "rackd/internal/transport"
18 "rackd/pkg/authenticate"
19 "rackd/pkg/region"
20 "rackd/pkg/register"
17)21)
1822
19type opts struct {23type opts struct {
@@ -76,6 +80,23 @@ var (
76 }80 }
77 defer metricsSrvr.Close()81 defer metricsSrvr.Close()
7882
83 initRegion := os.Getenv("REGION_URL")
84 rpcMgr := transport.NewRPCManager(initRegion, true) // TODO use the register command to provide info to connect instead and make TLS skip verify configurable
85 err = rpcMgr.Init(ctx)
86 if err != nil {
87 return err
88 }
89 rpcMgr.AddClient(ctx, authenticate.NewCapnpAuthenticator())
90 rpcMgr.AddClient(ctx, register.NewCapnpRegisterer())
91 err = rpcMgr.Init(ctx)
92 if err != nil {
93 return err
94 }
95 err = region.Handshake(ctx, initRegion, Version, rpcMgr)
96 if err != nil {
97 return err
98 }
99
79 log.Info().Msgf("rackd %v started successfully", Version)100 log.Info().Msgf("rackd %v started successfully", Version)
80101
81 sigChan := make(chan os.Signal, 4)102 sigChan := make(chan os.Signal, 4)
diff --git a/src/rackd_spike/go.mod b/src/rackd_spike/go.mod
index 3339fb7..73edbc6 100644
--- a/src/rackd_spike/go.mod
+++ b/src/rackd_spike/go.mod
@@ -3,11 +3,15 @@ module rackd
3go 1.163go 1.16
44
5require (5require (
6 capnproto.org/go/capnp/v3 v3.0.0-alpha.1
6 github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d7 github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d
7 github.com/coreos/go-systemd/v22 v22.3.28 github.com/coreos/go-systemd/v22 v22.3.2
8 github.com/kolo/xmlrpc v0.0.0-20201022064351-38db28db192b9 github.com/kolo/xmlrpc v0.0.0-20201022064351-38db28db192b
10 github.com/lxc/lxd v0.0.0-20210705204343-3596a3bcba59
11 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
9 github.com/prometheus/client_golang v0.9.312 github.com/prometheus/client_golang v0.9.3
10 github.com/rs/zerolog v1.23.013 github.com/rs/zerolog v1.23.0
11 github.com/spf13/cobra v1.1.314 github.com/spf13/cobra v1.1.3
15 gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b // indirect
12 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b16 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
13)17)
diff --git a/src/rackd_spike/go.sum b/src/rackd_spike/go.sum
index 4c08b8b..b61ac4f 100644
--- a/src/rackd_spike/go.sum
+++ b/src/rackd_spike/go.sum
@@ -1,3 +1,5 @@
1capnproto.org/go/capnp/v3 v3.0.0-alpha.1 h1:lA/zWC1XgaFez/UdqcWi5Bz1grsqPQDY5Ki4lgYrQ1o=
2capnproto.org/go/capnp/v3 v3.0.0-alpha.1/go.mod h1:izbWjXlvObqHwvhxwDBFLpY9lXSXIxDKRtnuktKHVsU=
1cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=3cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
2cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=4cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
3cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=5cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
@@ -110,11 +112,13 @@ github.com/kolo/xmlrpc v0.0.0-20201022064351-38db28db192b h1:iNjcivnc6lhbvJA3LD6
110github.com/kolo/xmlrpc v0.0.0-20201022064351-38db28db192b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM=112github.com/kolo/xmlrpc v0.0.0-20201022064351-38db28db192b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM=
111github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=113github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
112github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=114github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
113github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
114github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=115github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
115github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=116github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
116github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=117github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
117github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=118github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
119github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
120github.com/lxc/lxd v0.0.0-20210705204343-3596a3bcba59 h1:FvuAx1MSuzz2gC5fqGG1tL99SNm1JacG3kDWqL3vILo=
121github.com/lxc/lxd v0.0.0-20210705204343-3596a3bcba59/go.mod h1:2BaZflfwsv8a3uy3/Vw+de4Avn4DSrAiqaHJjCIXMV4=
118github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=122github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
119github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=123github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
120github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=124github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
@@ -132,9 +136,13 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh
132github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=136github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
133github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=137github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
134github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=138github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
139github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
140github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
135github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=141github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
136github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=142github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
137github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=143github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
144github.com/philhofer/fwd v1.1.1 h1:GdGcTjf5RNAxwS4QLsiMzJYj5KEvPJD3Abr261yRQXQ=
145github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
138github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=146github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
139github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=147github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
140github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=148github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -181,7 +189,10 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
181github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=189github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
182github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=190github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
183github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=191github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
192github.com/tinylib/msgp v1.1.5 h1:2gXmtWueD2HefZHQe1QOy9HVzmFrLOVvsXwXBQ0ayy0=
193github.com/tinylib/msgp v1.1.5/go.mod h1:eQsjooMTnV42mHu917E26IogZ2930nFyBQdofk10Udg=
184github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=194github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
195github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31/go.mod h1:onvgF043R+lC5RZ8IT9rBXDaEDnpnw/Cl+HFiw+v/7Q=
185github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=196github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
186github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=197github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
187go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=198go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
@@ -280,6 +291,7 @@ golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtn
280golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=291golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
281golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=292golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
282golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=293golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
294golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
283golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=295golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
284golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=296golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
285golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=297golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -307,8 +319,9 @@ google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiq
307google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=319google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
308gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=320gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
309gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=321gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
310gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
311gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=322gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
323gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U=
324gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
312gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=325gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
313gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=326gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
314gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=327gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
diff --git a/src/rackd_spike/internal/machine_helpers/env.go b/src/rackd_spike/internal/machine_helpers/env.go
315new file mode 100644328new file mode 100644
index 0000000..351d53c
--- /dev/null
+++ b/src/rackd_spike/internal/machine_helpers/env.go
@@ -0,0 +1,67 @@
1package machinehelpers
2
3import (
4 "fmt"
5 "io"
6 "os"
7 "path/filepath"
8 "strings"
9 "sync"
10)
11
12var (
13 maasId string
14)
15
16var (
17 maasIdLock = &sync.RWMutex{}
18)
19
20func GetMAASDataPath(path string) string {
21 basePath, ok := os.LookupEnv(path)
22 if !ok {
23 basePath = "/var/lib/maas"
24 }
25 return filepath.Join(basePath, path)
26}
27
28func GetMAASID() (string, error) {
29 maasIdLock.RLock()
30 defer maasIdLock.RUnlock()
31
32 if len(maasId) == 0 {
33 path := GetMAASDataPath("maas_id")
34 f, err := os.Open(path)
35 if err != nil {
36 if os.IsNotExist(err) {
37 return "", nil
38 }
39 return "", err
40 }
41 contents, err := io.ReadAll(f)
42 if err != nil {
43 return "", err
44 }
45 maasIdLock.Lock()
46 defer maasIdLock.Unlock()
47 maasId = strings.TrimSpace(string(contents))
48 }
49 return maasId, nil
50}
51
52func SetMAASId(id string) error {
53 path := GetMAASDataPath("maas_id")
54 maasIdLock.Lock()
55 defer maasIdLock.Unlock()
56 maasId = id
57 f, err := os.OpenFile(path, os.O_CREATE|os.O_RDWR, 0644)
58 if err != nil {
59 return err
60 }
61 defer f.Close()
62 _, err = fmt.Fprint(f, id)
63 if err != nil {
64 return err
65 }
66 return nil
67}
diff --git a/src/rackd_spike/internal/machine_helpers/info.go b/src/rackd_spike/internal/machine_helpers/info.go
0new file mode 10064468new file mode 100644
index 0000000..1517fc6
--- /dev/null
+++ b/src/rackd_spike/internal/machine_helpers/info.go
@@ -0,0 +1,24 @@
1package machinehelpers
2
3import (
4 lxdresources "github.com/lxc/lxd/shared/api"
5)
6
7type EnvInfo struct {
8 Kernel string `json:"kernel"`
9 KernelArchitecture string `json:"kernel_architecture"`
10 KernelVersion string `json:"kernel_version"`
11 OSName string `json:"os_name"`
12 OSVersion string `json:"os_version"`
13 Server string `json:"server"`
14 ServerName string `json:"server_name"`
15 ServerVersion string `json:"server_version"`
16}
17
18type MachineInfo struct {
19 APIExtensions []string `json:"api_extension"`
20 APIVersion string `json:"api_version"`
21 Environment EnvInfo `json:"environment"`
22 Resources lxdresources.Resources `json:"resources"`
23 Networks map[string]lxdresources.NetworkState `json:"networks"`
24}
diff --git a/src/rackd_spike/internal/machine_helpers/interfaces.go b/src/rackd_spike/internal/machine_helpers/interfaces.go
0new file mode 10064425new file mode 100644
index 0000000..cbf58e6
--- /dev/null
+++ b/src/rackd_spike/internal/machine_helpers/interfaces.go
@@ -0,0 +1,498 @@
1package machinehelpers
2
3import (
4 "bufio"
5 "context"
6 "encoding/json"
7 "fmt"
8 "io"
9 "net"
10 "os"
11 "os/exec"
12 "path/filepath"
13 "regexp"
14 "sort"
15 "strconv"
16 "strings"
17
18 lxdresources "github.com/lxc/lxd/shared/api"
19)
20
21var (
22 excludedInterfaceTypes = map[string]struct{}{
23 "loopback": {},
24 "ipip": {},
25 "tunnel": {},
26 }
27
28 leaseRx = regexp.MustCompile(`(?m)(^\s*lease\s+{([^}]+)})`)
29)
30
31func isExcludedType(ctx context.Context, t string) (bool, error) {
32 if _, ok := excludedInterfaceTypes[t]; ok {
33 return true, nil
34 }
35 runningContainer, err := RunningInContainer(ctx)
36 if err != nil {
37 return false, err
38 }
39 if runningContainer && t == "ethernet" {
40 return true, nil
41 }
42 if strings.HasPrefix("unknown-", t) {
43 return true, nil
44 }
45 return false, nil
46}
47
48func GetIPAddr(ctx context.Context) (map[string]lxdresources.NetworkState, error) {
49 cmdPath, err := GetResourcesBinPath()
50 if err != nil {
51 return nil, err
52 }
53 var args []string
54 if IsRunningInSnap() {
55 args = append(args, cmdPath)
56 cmdPath = "/usr/bin/sudo"
57 }
58 cmd := exec.CommandContext(ctx, cmdPath, args...)
59 out, err := cmd.Output()
60 if err != nil {
61 return nil, err
62 }
63 var info MachineInfo
64 err = json.Unmarshal(out, &info)
65 if err != nil {
66 return nil, err
67 }
68 return info.Networks, nil
69}
70
71func splitDhclientCmdlineFile(data []byte, atEOF bool) (advance int, token []byte, err error) {
72 for i := 0; i < len(data); i++ {
73 if data[i] == '\x00' {
74 return i + 1, data[:i], nil
75 }
76 if !atEOF {
77 return 0, nil, nil
78 }
79 }
80 return 0, data, bufio.ErrFinalToken
81}
82
83func GetLatestFixedAddress(leasePath string) (string, error) {
84 f, err := os.Open(leasePath)
85 if err != nil {
86 return "", err
87 }
88 defer f.Close()
89 return getLatestFixedAddress(f)
90}
91
92func getLatestFixedAddress(leaseFile io.Reader) (string, error) {
93 leaseBytes, err := io.ReadAll(leaseFile)
94 if err != nil {
95 return "", err
96 }
97 submatches := leaseRx.FindAllSubmatch(leaseBytes, -1)
98 if len(submatches) > 0 {
99 matches := submatches[len(submatches)-1]
100 if len(matches) > 0 {
101 lastLease := matches[len(matches)-1]
102 for _, line := range strings.Split(string(lastLease), "\n") {
103 line = strings.TrimSpace(line)
104 if len(line) > 0 {
105 lineList := strings.SplitN(line, " ", 2)
106 if len(lineList) < 2 {
107 continue
108 }
109 statement, value := lineList[0], lineList[1]
110 if statement == "fixed-address" || statement == "fixed-address6" {
111 return strings.TrimSpace(strings.SplitN(value, ";", 2)[0]), nil
112 }
113 }
114 }
115 }
116 }
117 return "", nil
118}
119
120func GetDhclientInfo(ctx context.Context, procPath string) (map[string]string, error) {
121 if len(procPath) == 0 {
122 procPath = "/proc"
123 }
124 pids, err := GetRunningPIDsWithCMD(ctx, "dhclient", "", false)
125 if err != nil {
126 return nil, err
127 }
128 info := make(map[string]string)
129 for _, pid := range pids {
130 cmdlinePath := filepath.Join(procPath, strconv.Itoa(pid), "cmdline")
131 err = func() error {
132 f, err := os.Open(cmdlinePath)
133 if err != nil {
134 return err
135 }
136 defer f.Close()
137 scanner := bufio.NewScanner(f)
138 scanner.Split(splitDhclientCmdlineFile)
139 var (
140 cmd []string
141 leasePath string
142 )
143 lfIdx := -1
144 for scanner.Scan() {
145 cmd = append(cmd, scanner.Text())
146 if cmd[len(cmd)-1] == "-lf" {
147 lfIdx = len(cmd) - 1
148 }
149 if lfIdx > -1 && len(cmd)-2 == lfIdx {
150 leasePath = cmd[len(cmd)-1]
151 }
152 }
153 ifaceName := cmd[len(cmd)-1]
154 ipAddr, err := GetLatestFixedAddress(leasePath)
155 if err != nil {
156 return err
157 }
158 if len(ipAddr) > 0 && ipAddr != " " {
159 info[ifaceName] = ipAddr
160 }
161 return nil
162 }()
163 if err != nil {
164 return nil, err
165 }
166 }
167 return info, nil
168}
169
170type IPLink struct {
171 Netmask int
172 Mode string
173 Address string
174 Gateway string
175}
176
177type Vlan struct {
178 LowerDev string
179 Vid uint64
180}
181
182type Interface struct {
183 Type string
184 Mac string
185 Links []IPLink
186 Enabled bool
187 Vlan *Vlan
188 Source string
189 Parents []string
190 Monitored bool
191}
192
193type sortableSubnets []*net.IPNet
194
195func (s sortableSubnets) Len() int {
196 return len(s)
197}
198
199func (s sortableSubnets) Less(i, j int) bool {
200 iPrefixlen, _ := s[i].Mask.Size()
201 jPrefixlen, _ := s[j].Mask.Size()
202 return iPrefixlen < jPrefixlen
203}
204
205func (s sortableSubnets) Swap(i, j int) {
206 tmp := s[j]
207 s[j] = s[i]
208 s[i] = tmp
209}
210
211func fixLinkAddresses(links []IPLink) ([]IPLink, error) {
212 var (
213 subnetsV4 []*net.IPNet
214 linksV4 []struct {
215 Link IPLink
216 Idx int
217 }
218 subnetsV6 []*net.IPNet
219 linksV6 []struct {
220 Link IPLink
221 Idx int
222 }
223 )
224 for i, link := range links {
225 var (
226 ipAddr net.IP
227 ipNet *net.IPNet
228 err error
229 )
230 if link.Netmask != 0 {
231 ipAddr, ipNet, err = net.ParseCIDR(fmt.Sprintf("%s/%d", link.Address, link.Netmask))
232 if err != nil {
233 return nil, err
234 }
235 } else {
236 ipAddr, ipNet, err = net.ParseCIDR(link.Address)
237 if err != nil {
238 return nil, err
239 }
240 }
241 prefixLen, _ := ipNet.Mask.Size()
242 if ipAddr.To4() != nil {
243 if prefixLen == 32 {
244 linksV4 = append(linksV4, struct {
245 Link IPLink
246 Idx int
247 }{
248 Link: link,
249 Idx: i,
250 })
251 } else {
252 subnetsV4 = append(subnetsV4, ipNet)
253 }
254 } else {
255 if prefixLen == 128 {
256 linksV6 = append(linksV6, struct {
257 Link IPLink
258 Idx int
259 }{
260 Link: link,
261 Idx: i,
262 })
263 } else {
264 subnetsV6 = append(subnetsV6, ipNet)
265 }
266 }
267 }
268 newLinks := [][]struct {
269 Link IPLink
270 Idx int
271 }{linksV4, linksV6}
272 newSubnets := [][]*net.IPNet{subnetsV4, subnetsV6}
273 for i, currLinks := range newLinks {
274 currSubnets := sortableSubnets(newSubnets[i])
275 var ok bool
276 currSubnets, ok = sort.Reverse(currSubnets).(sortableSubnets)
277 if !ok {
278 return nil, fmt.Errorf("sort.Reverse() returned a type other than sortableSubnets, %T", currSubnets)
279 }
280 for _, link := range currLinks {
281 var (
282 ip net.IP
283 err error
284 )
285 if link.Link.Netmask != 0 {
286 ip, _, err = net.ParseCIDR(
287 fmt.Sprintf("%s:%d", link.Link.Address, link.Link.Netmask),
288 )
289 } else {
290 ip, _, err = net.ParseCIDR(link.Link.Address)
291 }
292 if err != nil {
293 return nil, err
294 }
295 for _, subnet := range currSubnets {
296 if subnet.Contains(ip) {
297 prefixlen, _ := subnet.Mask.Size()
298 if link.Link.Netmask != 0 {
299 link.Link.Netmask = prefixlen
300 } else {
301 link.Link.Address = fmt.Sprintf("%s/%d", ip, prefixlen)
302 }
303 }
304 }
305 links[link.Idx] = link.Link
306 }
307 }
308 return links, nil
309}
310
311type IPRoute struct {
312 Gateway string `json:"gateway"`
313 GatewayIP net.IP `json:"-"`
314 Dev string `json:"dev"`
315 Protocol string `json:"protocol"`
316 Metric int `json:"metric"`
317 Flags []int `json:"flags"`
318}
319
320func GetIPRoute(ctx context.Context) (map[string]IPRoute, error) {
321 cmd := exec.CommandContext(ctx, "ip", "-json", "route", "list", "scope", "global")
322 routes := make(map[string]IPRoute)
323 var routeList []struct {
324 Name string `json:"dst"`
325 IPRoute
326 }
327 out, err := cmd.Output()
328 if err != nil {
329 return nil, err
330 }
331 err = json.Unmarshal(out, &routeList)
332 if err != nil {
333 return nil, err
334 }
335 for _, route := range routeList {
336 route.IPRoute.GatewayIP = net.ParseIP(route.Gateway)
337 routes[route.Name] = route.IPRoute
338 }
339 return routes, nil
340}
341
342func fixGateways(links []IPLink, ipRouteInfo map[string]IPRoute) ([]IPLink, error) {
343 for i, link := range links {
344 _, subnet, err := net.ParseCIDR(link.Address)
345 if err != nil {
346 return nil, err
347 }
348 if routeInfo, ok := ipRouteInfo[subnet.String()]; ok {
349 link.Gateway = routeInfo.Gateway
350 } else if defaultInfo, ok := ipRouteInfo["default"]; ok && subnet.Contains(defaultInfo.GatewayIP) {
351 link.Gateway = defaultInfo.Gateway
352 }
353 links[i] = link
354 }
355 return links, nil
356}
357
358func GetInterfaceChildren(interfaces map[string]Interface) map[string][]string {
359 children := make(map[string][]string)
360 for name, iface := range interfaces {
361 for _, parent := range iface.Parents {
362 if node, ok := children[parent]; ok {
363 node = append(node, name)
364 } else {
365 children[parent] = []string{name}
366 }
367 }
368 }
369 return children
370}
371
372type InterfaceChild struct {
373 Name string
374 Iface Interface
375}
376
377func InterfaceChildren(ifname string, interfaces map[string]Interface, children map[string][]string) (res []InterfaceChild) {
378 if node, ok := children[ifname]; ok {
379 for _, child := range node {
380 res = append(res, InterfaceChild{Name: child, Iface: interfaces[child]})
381 }
382 }
383 return res
384}
385
386func GetDefaultMonitoredInterfaces(interfaces map[string]Interface) (res map[string]struct{}) {
387 res = make(map[string]struct{})
388 childrenMap := GetInterfaceChildren(interfaces)
389 for name, iface := range interfaces {
390 if !iface.Enabled {
391 continue
392 }
393 switch iface.Type {
394 case "physical":
395 shouldMonitor := true
396 for _, child := range InterfaceChildren(name, interfaces, childrenMap) {
397 if child.Iface.Type == "bond" {
398 shouldMonitor = false
399 break
400 }
401 }
402 if shouldMonitor {
403 res[name] = struct{}{}
404 }
405 case "bond":
406 res[name] = struct{}{}
407 case "bridge":
408 if len(iface.Parents) == 0 {
409 res[name] = struct{}{}
410 }
411 }
412 }
413 return res
414}
415
416func GetAllInterfacesDefinition(ctx context.Context, annotateWithMonitored bool) (map[string]Interface, error) {
417 dhclientInfo, err := GetDhclientInfo(ctx, "")
418 if err != nil {
419 return nil, err
420 }
421 netIfaces, err := GetIPAddr(ctx)
422 if err != nil {
423 return nil, err
424 }
425 iprouteInfo, err := GetIPRoute(ctx)
426 if err != nil {
427 return nil, err
428 }
429 res := make(map[string]Interface)
430 for name, iface := range netIfaces {
431 excludeType, err := isExcludedType(ctx, iface.Type)
432 if err != nil {
433 return nil, err
434 }
435 if excludeType {
436 continue
437 }
438 i := Interface{
439 Mac: iface.Hwaddr,
440 Enabled: iface.State == "up",
441 }
442 if !(iface.Type == "vlan" || iface.Type == "bridge" || iface.Type == "bond") {
443 i.Type = "physical"
444 } else {
445 i.Type = iface.Type
446 if iface.Bond != nil && len(iface.Bond.LowerDevices) > 0 {
447 i.Parents = append(i.Parents, iface.Bond.LowerDevices...)
448 }
449 if iface.Bridge != nil && len(iface.Bridge.UpperDevices) > 0 {
450 i.Parents = append(i.Parents, iface.Bridge.UpperDevices...)
451 }
452 }
453 if iface.VLAN != nil {
454 i.Vlan = &Vlan{
455 LowerDev: iface.VLAN.LowerDevice,
456 Vid: iface.VLAN.VID,
457 }
458 i.Parents = append(i.Parents, iface.VLAN.LowerDevice)
459 }
460 dhcpAddr := dhclientInfo[name]
461 for _, addr := range iface.Addresses {
462 mode := "static"
463 if net.ParseIP(addr.Address).String() == dhcpAddr {
464 mode = "dhcp"
465 }
466
467 link := IPLink{Mode: mode, Address: addr.Address}
468 if len(addr.Netmask) > 0 {
469 link.Netmask, err = strconv.Atoi(addr.Netmask)
470 if err != nil {
471 return nil, err
472 }
473 }
474 i.Links = append(i.Links, link)
475 }
476 i.Links, err = fixLinkAddresses(i.Links)
477 if err != nil {
478 return nil, err
479 }
480 i.Links, err = fixGateways(i.Links, iprouteInfo)
481 if err != nil {
482 return nil, err
483 }
484 res[name] = i
485 }
486 if annotateWithMonitored {
487 monitoredIfaces := GetDefaultMonitoredInterfaces(res)
488 for name, iface := range res {
489 if _, ok := monitoredIfaces[name]; ok {
490 iface.Monitored = true
491 } else {
492 iface.Monitored = false
493 }
494 res[name] = iface
495 }
496 }
497 return res, nil
498}
diff --git a/src/rackd_spike/internal/machine_helpers/interfaces_capnp.go b/src/rackd_spike/internal/machine_helpers/interfaces_capnp.go
0new file mode 100644499new file mode 100644
index 0000000..777f0b4
--- /dev/null
+++ b/src/rackd_spike/internal/machine_helpers/interfaces_capnp.go
@@ -0,0 +1,65 @@
1package machinehelpers
2
3import (
4 "rackd/pkg/rpc"
5)
6
7type CapnpInterfaces map[string]Interface
8
9func (c CapnpInterfaces) SetProto(ifacePayload rpc.Interfaces) error {
10 ifaces, err := ifacePayload.NewIfaces(int32(len(c)))
11 if err != nil {
12 return err
13 }
14 var idx int
15 for name, iface := range c {
16 protoIface := ifaces.At(idx)
17 err = protoIface.SetName(name)
18 if err != nil {
19 return err
20 }
21 details, err := protoIface.NewIface()
22 if err != nil {
23 return err
24 }
25 details.SetMacAddress(iface.Mac)
26 details.SetType(iface.Type)
27 protoLinks, err := details.NewLinks(int32(len(iface.Links)))
28 if err != nil {
29 return err
30 }
31 for i, link := range iface.Links {
32 protoLink := protoLinks.At(i)
33 err = protoLink.SetMode(link.Mode)
34 if err != nil {
35 return err
36 }
37 err = protoLink.SetAddress(link.Address)
38 if err != nil {
39 return err
40 }
41 err = protoLink.SetGateway(link.Gateway)
42 if err != nil {
43 return err
44 }
45 protoLink.SetNetmask(int32(link.Netmask))
46 }
47 if iface.Vlan != nil {
48 details.SetVid(iface.Vlan.Vid)
49 }
50 if len(iface.Parents) > 0 {
51 protoParents, err := details.NewParents(int32(len(iface.Parents)))
52 if err != nil {
53 return err
54 }
55 for i, parent := range iface.Parents {
56 err = protoParents.Set(i, parent)
57 if err != nil {
58 return err
59 }
60 }
61 }
62 idx++
63 }
64 return nil
65}
diff --git a/src/rackd_spike/internal/machine_helpers/interfaces_test.go b/src/rackd_spike/internal/machine_helpers/interfaces_test.go
0new file mode 10064466new file mode 100644
index 0000000..a7d2b3c
--- /dev/null
+++ b/src/rackd_spike/internal/machine_helpers/interfaces_test.go
@@ -0,0 +1,81 @@
1package machinehelpers
2
3import (
4 "errors"
5 "io"
6 "testing"
7)
8
9type mockLeaseFile struct {
10 Data []byte
11}
12
13func (m mockLeaseFile) Read(b []byte) (n int, err error) {
14 n = copy(b, m.Data)
15 if n > 0 {
16 m.Data = m.Data[n:]
17 }
18 if len(m.Data) == 0 {
19 return n, io.EOF
20 }
21 return n, nil
22}
23
24func TestGetLatestFixedAddress(t *testing.T) {
25 table := []struct {
26 Name string
27 In mockLeaseFile
28 Out string
29 Err error
30 }{
31 {
32 Name: "basic-v4-lease-file",
33 In: mockLeaseFile{
34 Data: []byte(`
35 lease {
36 fixed-address 10.0.0.2;
37 }
38 `),
39 },
40 Out: "10.0.0.2",
41 }, {
42 Name: "basic-v6-lease-file",
43 In: mockLeaseFile{
44 Data: []byte(`
45 lease {
46 fixed-address6 fe80::ca56:eed8:1344:1aa2;
47 }
48 `),
49 },
50 Out: "fe80::ca56:eed8:1344:1aa2",
51 }, {
52 Name: "no-data-lease-file",
53 In: mockLeaseFile{},
54 }, {
55 Name: "multi-lease-lease-file",
56 In: mockLeaseFile{
57 Data: []byte(`
58 lease {
59 fixed-address 10.0.0.9;
60 }
61
62 lease {
63 fixed-address 10.0.0.2;
64 }
65 `),
66 },
67 Out: "10.0.0.2",
68 },
69 }
70 for _, tcase := range table {
71 t.Run(tcase.Name, func(tt *testing.T) {
72 out, err := getLatestFixedAddress(tcase.In)
73 if !errors.Is(err, tcase.Err) {
74 tt.Fatalf("expected %v to equal %v", err, tcase.Err)
75 }
76 if out != tcase.Out {
77 tt.Fatalf("expected '%s' to equal '%s'", out, tcase.Out)
78 }
79 })
80 }
81}
diff --git a/src/rackd_spike/internal/machine_helpers/ps.go b/src/rackd_spike/internal/machine_helpers/ps.go
0new file mode 10064482new file mode 100644
index 0000000..016564b
--- /dev/null
+++ b/src/rackd_spike/internal/machine_helpers/ps.go
@@ -0,0 +1,81 @@
1package machinehelpers
2
3import (
4 "bufio"
5 "context"
6 "os"
7 "os/exec"
8 "path/filepath"
9 "strconv"
10 "strings"
11)
12
13const (
14 vertCheckExec = "systemd-detect-virt"
15)
16
17var (
18 vertCheckArgs = []string{"-c"}
19)
20
21func RunningInContainer(ctx context.Context) (bool, error) {
22 cmd := exec.CommandContext(ctx, vertCheckExec, vertCheckArgs...)
23 if err := cmd.Run(); err != nil {
24 if cmd.ProcessState.ExitCode() == 1 {
25 return false, nil
26 }
27 return false, err
28 }
29 return true, nil
30}
31
32func PIDInContainer(pid int, procPath string) (bool, error) {
33 if len(procPath) == 0 {
34 procPath = "/proc"
35 }
36 cgroupPath := filepath.Join(procPath, strconv.Itoa(pid), "cgroup")
37 f, err := os.Open(cgroupPath)
38 if err != nil {
39 return false, err
40 }
41 defer f.Close()
42 scanner := bufio.NewScanner(f)
43 for scanner.Scan() {
44 line := scanner.Text()
45 cgroup := strings.SplitN(line, ":", 2)
46 // cgroup[2] will be the cgroup heirarchy
47 if strings.HasPrefix(cgroup[2], "/lxc") || strings.Contains(cgroup[2], "docker") {
48 return true, nil
49 }
50 }
51 return false, nil
52}
53
54func GetRunningPIDsWithCMD(ctx context.Context, command, procPath string, excludeContainerProcesses bool) ([]int, error) {
55 if len(procPath) == 0 {
56 procPath = "/proc"
57 }
58 dirs, err := os.ReadDir(procPath)
59 if err != nil {
60 return nil, err
61 }
62 var runningPIDs []int
63 runningInContainer, err := RunningInContainer(ctx)
64 if err != nil {
65 return nil, err
66 }
67 for _, dir := range dirs {
68 pid, parseErr := strconv.Atoi(dir.Name())
69 if parseErr == nil {
70 pidInContainer, err := PIDInContainer(pid, procPath)
71 if err != nil {
72 return nil, err
73 }
74 if excludeContainerProcesses && !runningInContainer && pidInContainer {
75 continue
76 }
77 runningPIDs = append(runningPIDs, pid)
78 }
79 }
80 return runningPIDs, nil
81}
diff --git a/src/rackd_spike/internal/machine_helpers/refresh.go b/src/rackd_spike/internal/machine_helpers/refresh.go
0new file mode 10064482new file mode 100644
index 0000000..685460b
--- /dev/null
+++ b/src/rackd_spike/internal/machine_helpers/refresh.go
@@ -0,0 +1,29 @@
1package machinehelpers
2
3import (
4 "path/filepath"
5 "runtime"
6)
7
8func isDevEnv() bool {
9 // TODO grab this value from config
10 return true
11}
12
13func GetResourcesBinPath() (string, error) {
14 var path string
15 if isDevEnv() {
16 path = "src/machine-resources/bin"
17 } else {
18 prefix, ok := SnapPaths{}.FromEnv()["snap"]
19 path = "/usr/share/maas/machine-resources"
20 if ok {
21 path = prefix + path
22 }
23 }
24 absPath, err := filepath.Abs(path)
25 if err != nil {
26 return "", err
27 }
28 return filepath.Join(absPath, runtime.GOARCH), nil
29}
diff --git a/src/rackd_spike/internal/machine_helpers/snap.go b/src/rackd_spike/internal/machine_helpers/snap.go
0new file mode 10064430new file mode 100644
index 0000000..0956377
--- /dev/null
+++ b/src/rackd_spike/internal/machine_helpers/snap.go
@@ -0,0 +1,30 @@
1package machinehelpers
2
3import (
4 "os"
5)
6
7var (
8 pathVars = map[string]string{
9 "snap": "SNAP",
10 "common": "SNAP_COMMON",
11 "data": "SNAP_DATA",
12 }
13)
14
15func IsRunningInSnap() bool {
16 _, ok := os.LookupEnv("SNAP")
17 return ok
18}
19
20type SnapPaths map[string]string
21
22func (s SnapPaths) FromEnv() SnapPaths {
23 for k, v := range pathVars {
24 path, ok := os.LookupEnv(v)
25 if ok {
26 s[k] = path
27 }
28 }
29 return s
30}
diff --git a/src/rackd_spike/internal/transport/rpc.go b/src/rackd_spike/internal/transport/rpc.go
0new file mode 10064431new file mode 100644
index 0000000..c0764d0
--- /dev/null
+++ b/src/rackd_spike/internal/transport/rpc.go
@@ -0,0 +1,127 @@
1package transport
2
3import (
4 "context"
5 "crypto/tls"
6 "errors"
7 "net"
8 "net/url"
9
10 capnprpc "capnproto.org/go/capnp/v3/rpc"
11 "github.com/rs/zerolog"
12
13 "rackd/internal/metrics"
14)
15
16var (
17 ErrRPCClientNotFound = errors.New("error client not found")
18)
19
20type RPCHandler interface {
21 Name() string
22 RegisterMetrics(*metrics.Registry) error
23 SetupServer(context.Context, *ConnWrapper)
24}
25
26type RPCClient interface {
27 Name() string
28 RegisterMetrics(*metrics.Registry) error
29 SetupClient(context.Context, *ConnWrapper)
30}
31
32type CapnpRPCClient interface {
33 RPCClient
34 Release()
35}
36
37type ConnWrapper struct {
38 Conn net.Conn
39 capnpConn *capnprpc.Conn
40}
41
42func NewConnWrapper(conn net.Conn) *ConnWrapper {
43 return &ConnWrapper{
44 Conn: conn,
45 capnpConn: capnprpc.NewConn(capnprpc.NewStreamTransport(conn), nil),
46 }
47}
48
49func (c *ConnWrapper) Capnp() *capnprpc.Conn {
50 return c.capnpConn
51}
52
53type RPCManager struct {
54 conns map[string]*ConnWrapper
55 handlers map[string]RPCHandler
56 clients map[string]RPCClient
57 initURL string
58 skipHostVerify bool
59}
60
61func NewRPCManager(rpcServerURL string, skipHostVerify bool) *RPCManager {
62 return &RPCManager{
63 conns: make(map[string]*ConnWrapper),
64 handlers: make(map[string]RPCHandler),
65 clients: make(map[string]RPCClient),
66 initURL: rpcServerURL,
67 skipHostVerify: skipHostVerify,
68 }
69}
70
71// Init initiates the initial region connection
72func (r *RPCManager) Init(ctx context.Context) error {
73 parsedURL, err := url.Parse(r.initURL)
74 if err != nil {
75 return err
76 }
77 var conn net.Conn
78 if parsedURL.Scheme == "https" {
79 conn, err = tls.Dial(
80 "tcp",
81 net.JoinHostPort(parsedURL.Hostname(), parsedURL.Port()),
82 &tls.Config{InsecureSkipVerify: r.skipHostVerify},
83 )
84 } else {
85 conn, err = net.Dial("tcp", net.JoinHostPort(parsedURL.Hostname(), parsedURL.Port()))
86 }
87 if err != nil {
88 return err
89 }
90 r.AddConn(ctx, conn)
91 log := zerolog.Ctx(ctx)
92 log.Debug().Msg("connected to region server")
93 return nil
94}
95
96func (r *RPCManager) AddHandler(ctx context.Context, handler RPCHandler) {
97 r.handlers[handler.Name()] = handler
98 for _, conn := range r.conns {
99 handler.SetupServer(ctx, conn)
100 }
101}
102
103func (r *RPCManager) AddClient(ctx context.Context, client RPCClient) {
104 r.clients[client.Name()] = client
105 for _, conn := range r.conns {
106 client.SetupClient(ctx, conn)
107 }
108}
109
110func (r *RPCManager) AddConn(ctx context.Context, conn net.Conn) {
111 newConn := NewConnWrapper(conn)
112 r.conns[conn.RemoteAddr().String()] = newConn
113 for _, handler := range r.handlers {
114 handler.SetupServer(ctx, newConn)
115 }
116 for _, client := range r.clients {
117 client.SetupClient(ctx, newConn)
118 }
119}
120
121func (r *RPCManager) GetClient(clientName string) (RPCClient, error) {
122 c, ok := r.clients[clientName]
123 if !ok {
124 return nil, ErrRPCClientNotFound
125 }
126 return c, nil
127}
diff --git a/src/rackd_spike/pkg/authenticate/authenticator.go b/src/rackd_spike/pkg/authenticate/authenticator.go
0new file mode 100644128new file mode 100644
index 0000000..6a60a86
--- /dev/null
+++ b/src/rackd_spike/pkg/authenticate/authenticator.go
@@ -0,0 +1,93 @@
1package authenticate
2
3import (
4 "bytes"
5 "context"
6 "fmt"
7
8 "rackd/internal/metrics"
9 "rackd/internal/transport"
10 "rackd/pkg/rpc"
11)
12
13type AuthCreds struct {
14 Salt []byte
15 Digest []byte
16}
17
18func (c *AuthCreds) localDigest(secret, message []byte) []byte {
19 // TODO
20 return nil
21}
22
23func (c *AuthCreds) Verify(secret, message []byte) bool {
24 return bytes.Compare(c.Digest, c.localDigest(secret, message)) == 0
25}
26
27type Authenticator interface {
28 transport.RPCClient
29 Authenticate(context.Context, string, []byte, []byte) (*AuthCreds, error)
30}
31
32type CapnpAuthenticator struct {
33 clients map[string]*rpc.Authenticator
34}
35
36func NewCapnpAuthenticator() Authenticator {
37 // Perhaps we should initialize this with the shared secret already loaded either
38 // from the config manager or load from the FS on instantiation?
39 return &CapnpAuthenticator{
40 clients: make(map[string]*rpc.Authenticator),
41 }
42}
43
44func (c *CapnpAuthenticator) Name() string {
45 return "authenticator"
46}
47
48func (c *CapnpAuthenticator) RegisterMetrics(registry *metrics.Registry) error {
49 // TODO
50 return nil
51}
52
53func (c *CapnpAuthenticator) SetupClient(ctx context.Context, conn *transport.ConnWrapper) {
54 c.clients[conn.Conn.RemoteAddr().String()] = &rpc.Authenticator{Client: conn.Capnp().Bootstrap(ctx)}
55}
56
57func (c *CapnpAuthenticator) Authenticate(ctx context.Context, region string, secret, message []byte) (*AuthCreds, error) {
58 regionClient, ok := c.clients[region]
59 if !ok {
60 return nil, fmt.Errorf("%w: %s", transport.ErrRPCClientNotFound, region)
61 }
62 result, release := regionClient.Authenticate(ctx, func(params rpc.Authenticator_authenticate_Params) error {
63 return params.SetMsg(message)
64 })
65 defer release()
66 resp, err := result.Struct()
67 if err != nil {
68 return nil, err
69 }
70 creds, err := resp.Resp()
71 if err != nil {
72 return nil, err
73 }
74 salt, err := creds.Salt()
75 if err != nil {
76 return nil, err
77 }
78 digest, err := creds.Digest()
79 if err != nil {
80 return nil, err
81 }
82 return &AuthCreds{
83 Salt: salt,
84 Digest: digest,
85 }, nil
86}
87
88func (c *CapnpAuthenticator) Release() {
89 for k, client := range c.clients {
90 client.Release()
91 delete(c.clients, k)
92 }
93}
diff --git a/src/rackd_spike/pkg/region/handshake.go b/src/rackd_spike/pkg/region/handshake.go
0new file mode 10064494new file mode 100644
index 0000000..4d1a090
--- /dev/null
+++ b/src/rackd_spike/pkg/region/handshake.go
@@ -0,0 +1,91 @@
1package region
2
3import (
4 "context"
5 "crypto/rand"
6 "errors"
7 "fmt"
8 "os"
9
10 machinehelpers "rackd/internal/machine_helpers"
11 "rackd/internal/transport"
12 auth "rackd/pkg/authenticate"
13 reg "rackd/pkg/register"
14)
15
16var (
17 ErrNoAuthenticatorProvided = errors.New("error no authenticator was provided")
18 ErrNoRegistererProvided = errors.New("error no registerer was provided")
19 ErrRegionNotAuthed = errors.New("error unable to authenticate with region")
20)
21
22func authenticate(ctx context.Context, region string, rpcMgr *transport.RPCManager) error {
23 authenticatorIface, err := rpcMgr.GetClient("authenticator")
24 if err != nil {
25 return err
26 }
27 authenticator, ok := authenticatorIface.(auth.Authenticator)
28 if !ok {
29 return ErrNoAuthenticatorProvided
30 }
31 secret := []byte{} // TODO get this from filesystem
32 message := make([]byte, 16)
33 _, err = rand.Read(message)
34 if err != nil {
35 return err
36 }
37 creds, err := authenticator.Authenticate(ctx, region, secret, message)
38 if err != nil {
39 return err
40 }
41 if !creds.Verify(secret, message) {
42 return fmt.Errorf("%w: credential verification failed", ErrRegionNotAuthed)
43 }
44 return nil
45}
46
47func register(ctx context.Context, region, localVersion string, rpcMgr *transport.RPCManager) error {
48 registererIface, err := rpcMgr.GetClient("registerer")
49 if err != nil {
50 return err
51 }
52 registerer, ok := registererIface.(reg.Registerer)
53 if !ok {
54 return ErrNoRegistererProvided
55 }
56 // TODO get cluster UUID from config
57 clusterUUID := "123456"
58 systemId, err := machinehelpers.GetMAASID()
59 if err != nil {
60 return err
61 }
62 interfaces, err := machinehelpers.GetAllInterfacesDefinition(ctx, false)
63 if err != nil {
64 return err
65 }
66 hostname, err := os.Hostname()
67 if err != nil {
68 return err
69 }
70 err = registerer.Register(
71 ctx,
72 region,
73 clusterUUID,
74 systemId,
75 hostname,
76 localVersion,
77 interfaces,
78 )
79 if err != nil {
80 return err
81 }
82 return nil
83}
84
85func Handshake(ctx context.Context, region, localVersion string, rpcMgr *transport.RPCManager) error {
86 err := authenticate(ctx, region, rpcMgr)
87 if err != nil {
88 return err
89 }
90 return register(ctx, region, localVersion, rpcMgr)
91}
diff --git a/src/rackd_spike/pkg/register/registerer.go b/src/rackd_spike/pkg/register/registerer.go
0new file mode 10064492new file mode 100644
index 0000000..b6562e7
--- /dev/null
+++ b/src/rackd_spike/pkg/register/registerer.go
@@ -0,0 +1,125 @@
1package register
2
3import (
4 "context"
5
6 "github.com/rs/zerolog"
7
8 machinehelpers "rackd/internal/machine_helpers"
9 "rackd/internal/metrics"
10 "rackd/internal/transport"
11 "rackd/pkg/rpc"
12)
13
14type Registerer interface {
15 transport.RPCClient
16 Register(
17 ctx context.Context,
18 region, clusterUUID, systemId, hostname, version string,
19 interfaces map[string]machinehelpers.Interface,
20 ) error
21}
22
23type CapnpRegisterer struct {
24 clients map[string]*rpc.Registerer
25}
26
27func NewCapnpRegisterer() Registerer {
28 return &CapnpRegisterer{}
29}
30
31func (c *CapnpRegisterer) Name() string {
32 return "Registerer"
33}
34
35func (c *CapnpRegisterer) RegisterMetrics(registry *metrics.Registry) error {
36 // TODO
37 return nil
38}
39
40func (c *CapnpRegisterer) SetupClient(ctx context.Context, client *transport.ConnWrapper) {
41 c.clients[client.Conn.RemoteAddr().String()] = &rpc.Registerer{Client: client.Capnp().Bootstrap(ctx)}
42}
43
44func (c *CapnpRegisterer) Register(
45 ctx context.Context,
46 region, clusterUUID, systemId, hostname, version string,
47 interfaces map[string]machinehelpers.Interface,
48) error {
49 client, ok := c.clients[region]
50 if !ok {
51 return transport.ErrRPCClientNotFound
52 }
53 result, release := client.Register(ctx, func(params rpc.Registerer_register_Params) error {
54 req, err := params.NewReq()
55 if err != nil {
56 return err
57 }
58 err = req.SetSystemId(systemId)
59 if err != nil {
60 return err
61 }
62 err = req.SetHostname(hostname)
63 if err != nil {
64 return err
65 }
66 ifaces, err := req.NewInterfaces()
67 if err != nil {
68 return err
69 }
70 capnpIfaces := machinehelpers.CapnpInterfaces(interfaces)
71 err = capnpIfaces.SetProto(ifaces)
72 if err != nil {
73 return err
74 }
75 err = req.SetUrl(region)
76 if err != nil {
77 return err
78 }
79 err = req.SetNodegroup(clusterUUID)
80 if err != nil {
81 return err
82 }
83 req.SetBeaconSupport(true)
84 err = req.SetVersion(version)
85 if err != nil {
86 return err
87 }
88 return nil
89 })
90 defer release()
91 resp, err := result.Struct()
92 if err != nil {
93 return err
94 }
95 res, err := resp.Resp()
96 if err != nil {
97 return err
98 }
99 localId, err := res.SystemId()
100 if err != nil {
101 return err
102 }
103 // TODO set global metrics labels
104 err = machinehelpers.SetMAASId(localId)
105 if err != nil {
106 return err
107 }
108 respVersion, err := res.Version()
109 if err != nil {
110 return err
111 }
112 if len(respVersion) == 0 {
113 respVersion = "unknown MAAS version"
114 }
115 log := zerolog.Ctx(ctx)
116 log.Log().Msgf("Rack controller '%s' registered (via %s) with %s.", localId, region, respVersion)
117 return nil
118}
119
120func (c *CapnpRegisterer) Release() {
121 for k, client := range c.clients {
122 client.Release()
123 delete(c.clients, k)
124 }
125}
diff --git a/src/rackd_spike/pkg/rpc/handshake.capnp.go b/src/rackd_spike/pkg/rpc/handshake.capnp.go
0new file mode 100644126new file mode 100644
index 0000000..94955c9
--- /dev/null
+++ b/src/rackd_spike/pkg/rpc/handshake.capnp.go
@@ -0,0 +1,933 @@
1// Code generated by capnpc-go. DO NOT EDIT.
2
3package rpc
4
5import (
6 capnp "capnproto.org/go/capnp/v3"
7 text "capnproto.org/go/capnp/v3/encoding/text"
8 schemas "capnproto.org/go/capnp/v3/schemas"
9 server "capnproto.org/go/capnp/v3/server"
10 context "context"
11)
12
13type AuthResponse struct{ capnp.Struct }
14
15// AuthResponse_TypeID is the unique identifier for the type AuthResponse.
16const AuthResponse_TypeID = 0x98b03f82d720e4e1
17
18func NewAuthResponse(s *capnp.Segment) (AuthResponse, error) {
19 st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 2})
20 return AuthResponse{st}, err
21}
22
23func NewRootAuthResponse(s *capnp.Segment) (AuthResponse, error) {
24 st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 2})
25 return AuthResponse{st}, err
26}
27
28func ReadRootAuthResponse(msg *capnp.Message) (AuthResponse, error) {
29 root, err := msg.Root()
30 return AuthResponse{root.Struct()}, err
31}
32
33func (s AuthResponse) String() string {
34 str, _ := text.Marshal(0x98b03f82d720e4e1, s.Struct)
35 return str
36}
37
38func (s AuthResponse) Salt() ([]byte, error) {
39 p, err := s.Struct.Ptr(0)
40 return []byte(p.Data()), err
41}
42
43func (s AuthResponse) HasSalt() bool {
44 return s.Struct.HasPtr(0)
45}
46
47func (s AuthResponse) SetSalt(v []byte) error {
48 return s.Struct.SetData(0, v)
49}
50
51func (s AuthResponse) Digest() ([]byte, error) {
52 p, err := s.Struct.Ptr(1)
53 return []byte(p.Data()), err
54}
55
56func (s AuthResponse) HasDigest() bool {
57 return s.Struct.HasPtr(1)
58}
59
60func (s AuthResponse) SetDigest(v []byte) error {
61 return s.Struct.SetData(1, v)
62}
63
64// AuthResponse_List is a list of AuthResponse.
65type AuthResponse_List struct{ capnp.List }
66
67// NewAuthResponse creates a new list of AuthResponse.
68func NewAuthResponse_List(s *capnp.Segment, sz int32) (AuthResponse_List, error) {
69 l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 0, PointerCount: 2}, sz)
70 return AuthResponse_List{l}, err
71}
72
73func (s AuthResponse_List) At(i int) AuthResponse { return AuthResponse{s.List.Struct(i)} }
74
75func (s AuthResponse_List) Set(i int, v AuthResponse) error { return s.List.SetStruct(i, v.Struct) }
76
77func (s AuthResponse_List) String() string {
78 str, _ := text.MarshalList(0x98b03f82d720e4e1, s.List)
79 return str
80}
81
82// AuthResponse_Future is a wrapper for a AuthResponse promised by a client call.
83type AuthResponse_Future struct{ *capnp.Future }
84
85func (p AuthResponse_Future) Struct() (AuthResponse, error) {
86 s, err := p.Future.Struct()
87 return AuthResponse{s}, err
88}
89
90type Authenticator struct{ Client *capnp.Client }
91
92// Authenticator_TypeID is the unique identifier for the type Authenticator.
93const Authenticator_TypeID = 0x800ae3a77a7bc18e
94
95func (c Authenticator) Authenticate(ctx context.Context, params func(Authenticator_authenticate_Params) error) (Authenticator_authenticate_Results_Future, capnp.ReleaseFunc) {
96 s := capnp.Send{
97 Method: capnp.Method{
98 InterfaceID: 0x800ae3a77a7bc18e,
99 MethodID: 0,
100 InterfaceName: "handshake.capnp:Authenticator",
101 MethodName: "authenticate",
102 },
103 }
104 if params != nil {
105 s.ArgsSize = capnp.ObjectSize{DataSize: 0, PointerCount: 1}
106 s.PlaceArgs = func(s capnp.Struct) error { return params(Authenticator_authenticate_Params{Struct: s}) }
107 }
108 ans, release := c.Client.SendCall(ctx, s)
109 return Authenticator_authenticate_Results_Future{Future: ans.Future()}, release
110}
111
112func (c Authenticator) AddRef() Authenticator {
113 return Authenticator{
114 Client: c.Client.AddRef(),
115 }
116}
117
118func (c Authenticator) Release() {
119 c.Client.Release()
120}
121
122// A Authenticator_Server is a Authenticator with a local implementation.
123type Authenticator_Server interface {
124 Authenticate(context.Context, Authenticator_authenticate) error
125}
126
127// Authenticator_NewServer creates a new Server from an implementation of Authenticator_Server.
128func Authenticator_NewServer(s Authenticator_Server, policy *server.Policy) *server.Server {
129 c, _ := s.(server.Shutdowner)
130 return server.New(Authenticator_Methods(nil, s), s, c, policy)
131}
132
133// Authenticator_ServerToClient creates a new Client from an implementation of Authenticator_Server.
134// The caller is responsible for calling Release on the returned Client.
135func Authenticator_ServerToClient(s Authenticator_Server, policy *server.Policy) Authenticator {
136 return Authenticator{Client: capnp.NewClient(Authenticator_NewServer(s, policy))}
137}
138
139// Authenticator_Methods appends Methods to a slice that invoke the methods on s.
140// This can be used to create a more complicated Server.
141func Authenticator_Methods(methods []server.Method, s Authenticator_Server) []server.Method {
142 if cap(methods) == 0 {
143 methods = make([]server.Method, 0, 1)
144 }
145
146 methods = append(methods, server.Method{
147 Method: capnp.Method{
148 InterfaceID: 0x800ae3a77a7bc18e,
149 MethodID: 0,
150 InterfaceName: "handshake.capnp:Authenticator",
151 MethodName: "authenticate",
152 },
153 Impl: func(ctx context.Context, call *server.Call) error {
154 return s.Authenticate(ctx, Authenticator_authenticate{call})
155 },
156 })
157
158 return methods
159}
160
161// Authenticator_authenticate holds the state for a server call to Authenticator.authenticate.
162// See server.Call for documentation.
163type Authenticator_authenticate struct {
164 *server.Call
165}
166
167// Args returns the call's arguments.
168func (c Authenticator_authenticate) Args() Authenticator_authenticate_Params {
169 return Authenticator_authenticate_Params{Struct: c.Call.Args()}
170}
171
172// AllocResults allocates the results struct.
173func (c Authenticator_authenticate) AllocResults() (Authenticator_authenticate_Results, error) {
174 r, err := c.Call.AllocResults(capnp.ObjectSize{DataSize: 0, PointerCount: 1})
175 return Authenticator_authenticate_Results{Struct: r}, err
176}
177
178type Authenticator_authenticate_Params struct{ capnp.Struct }
179
180// Authenticator_authenticate_Params_TypeID is the unique identifier for the type Authenticator_authenticate_Params.
181const Authenticator_authenticate_Params_TypeID = 0xdbaca3bedaffa653
182
183func NewAuthenticator_authenticate_Params(s *capnp.Segment) (Authenticator_authenticate_Params, error) {
184 st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 1})
185 return Authenticator_authenticate_Params{st}, err
186}
187
188func NewRootAuthenticator_authenticate_Params(s *capnp.Segment) (Authenticator_authenticate_Params, error) {
189 st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 1})
190 return Authenticator_authenticate_Params{st}, err
191}
192
193func ReadRootAuthenticator_authenticate_Params(msg *capnp.Message) (Authenticator_authenticate_Params, error) {
194 root, err := msg.Root()
195 return Authenticator_authenticate_Params{root.Struct()}, err
196}
197
198func (s Authenticator_authenticate_Params) String() string {
199 str, _ := text.Marshal(0xdbaca3bedaffa653, s.Struct)
200 return str
201}
202
203func (s Authenticator_authenticate_Params) Msg() ([]byte, error) {
204 p, err := s.Struct.Ptr(0)
205 return []byte(p.Data()), err
206}
207
208func (s Authenticator_authenticate_Params) HasMsg() bool {
209 return s.Struct.HasPtr(0)
210}
211
212func (s Authenticator_authenticate_Params) SetMsg(v []byte) error {
213 return s.Struct.SetData(0, v)
214}
215
216// Authenticator_authenticate_Params_List is a list of Authenticator_authenticate_Params.
217type Authenticator_authenticate_Params_List struct{ capnp.List }
218
219// NewAuthenticator_authenticate_Params creates a new list of Authenticator_authenticate_Params.
220func NewAuthenticator_authenticate_Params_List(s *capnp.Segment, sz int32) (Authenticator_authenticate_Params_List, error) {
221 l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 0, PointerCount: 1}, sz)
222 return Authenticator_authenticate_Params_List{l}, err
223}
224
225func (s Authenticator_authenticate_Params_List) At(i int) Authenticator_authenticate_Params {
226 return Authenticator_authenticate_Params{s.List.Struct(i)}
227}
228
229func (s Authenticator_authenticate_Params_List) Set(i int, v Authenticator_authenticate_Params) error {
230 return s.List.SetStruct(i, v.Struct)
231}
232
233func (s Authenticator_authenticate_Params_List) String() string {
234 str, _ := text.MarshalList(0xdbaca3bedaffa653, s.List)
235 return str
236}
237
238// Authenticator_authenticate_Params_Future is a wrapper for a Authenticator_authenticate_Params promised by a client call.
239type Authenticator_authenticate_Params_Future struct{ *capnp.Future }
240
241func (p Authenticator_authenticate_Params_Future) Struct() (Authenticator_authenticate_Params, error) {
242 s, err := p.Future.Struct()
243 return Authenticator_authenticate_Params{s}, err
244}
245
246type Authenticator_authenticate_Results struct{ capnp.Struct }
247
248// Authenticator_authenticate_Results_TypeID is the unique identifier for the type Authenticator_authenticate_Results.
249const Authenticator_authenticate_Results_TypeID = 0x96c07ce683897942
250
251func NewAuthenticator_authenticate_Results(s *capnp.Segment) (Authenticator_authenticate_Results, error) {
252 st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 1})
253 return Authenticator_authenticate_Results{st}, err
254}
255
256func NewRootAuthenticator_authenticate_Results(s *capnp.Segment) (Authenticator_authenticate_Results, error) {
257 st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 1})
258 return Authenticator_authenticate_Results{st}, err
259}
260
261func ReadRootAuthenticator_authenticate_Results(msg *capnp.Message) (Authenticator_authenticate_Results, error) {
262 root, err := msg.Root()
263 return Authenticator_authenticate_Results{root.Struct()}, err
264}
265
266func (s Authenticator_authenticate_Results) String() string {
267 str, _ := text.Marshal(0x96c07ce683897942, s.Struct)
268 return str
269}
270
271func (s Authenticator_authenticate_Results) Resp() (AuthResponse, error) {
272 p, err := s.Struct.Ptr(0)
273 return AuthResponse{Struct: p.Struct()}, err
274}
275
276func (s Authenticator_authenticate_Results) HasResp() bool {
277 return s.Struct.HasPtr(0)
278}
279
280func (s Authenticator_authenticate_Results) SetResp(v AuthResponse) error {
281 return s.Struct.SetPtr(0, v.Struct.ToPtr())
282}
283
284// NewResp sets the resp field to a newly
285// allocated AuthResponse struct, preferring placement in s's segment.
286func (s Authenticator_authenticate_Results) NewResp() (AuthResponse, error) {
287 ss, err := NewAuthResponse(s.Struct.Segment())
288 if err != nil {
289 return AuthResponse{}, err
290 }
291 err = s.Struct.SetPtr(0, ss.Struct.ToPtr())
292 return ss, err
293}
294
295// Authenticator_authenticate_Results_List is a list of Authenticator_authenticate_Results.
296type Authenticator_authenticate_Results_List struct{ capnp.List }
297
298// NewAuthenticator_authenticate_Results creates a new list of Authenticator_authenticate_Results.
299func NewAuthenticator_authenticate_Results_List(s *capnp.Segment, sz int32) (Authenticator_authenticate_Results_List, error) {
300 l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 0, PointerCount: 1}, sz)
301 return Authenticator_authenticate_Results_List{l}, err
302}
303
304func (s Authenticator_authenticate_Results_List) At(i int) Authenticator_authenticate_Results {
305 return Authenticator_authenticate_Results{s.List.Struct(i)}
306}
307
308func (s Authenticator_authenticate_Results_List) Set(i int, v Authenticator_authenticate_Results) error {
309 return s.List.SetStruct(i, v.Struct)
310}
311
312func (s Authenticator_authenticate_Results_List) String() string {
313 str, _ := text.MarshalList(0x96c07ce683897942, s.List)
314 return str
315}
316
317// Authenticator_authenticate_Results_Future is a wrapper for a Authenticator_authenticate_Results promised by a client call.
318type Authenticator_authenticate_Results_Future struct{ *capnp.Future }
319
320func (p Authenticator_authenticate_Results_Future) Struct() (Authenticator_authenticate_Results, error) {
321 s, err := p.Future.Struct()
322 return Authenticator_authenticate_Results{s}, err
323}
324
325func (p Authenticator_authenticate_Results_Future) Resp() AuthResponse_Future {
326 return AuthResponse_Future{Future: p.Future.Field(0, nil)}
327}
328
329type RegisterRequest struct{ capnp.Struct }
330
331// RegisterRequest_TypeID is the unique identifier for the type RegisterRequest.
332const RegisterRequest_TypeID = 0x8a21a43d866e69f4
333
334func NewRegisterRequest(s *capnp.Segment) (RegisterRequest, error) {
335 st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 8, PointerCount: 6})
336 return RegisterRequest{st}, err
337}
338
339func NewRootRegisterRequest(s *capnp.Segment) (RegisterRequest, error) {
340 st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 8, PointerCount: 6})
341 return RegisterRequest{st}, err
342}
343
344func ReadRootRegisterRequest(msg *capnp.Message) (RegisterRequest, error) {
345 root, err := msg.Root()
346 return RegisterRequest{root.Struct()}, err
347}
348
349func (s RegisterRequest) String() string {
350 str, _ := text.Marshal(0x8a21a43d866e69f4, s.Struct)
351 return str
352}
353
354func (s RegisterRequest) SystemId() (string, error) {
355 p, err := s.Struct.Ptr(0)
356 return p.Text(), err
357}
358
359func (s RegisterRequest) HasSystemId() bool {
360 return s.Struct.HasPtr(0)
361}
362
363func (s RegisterRequest) SystemIdBytes() ([]byte, error) {
364 p, err := s.Struct.Ptr(0)
365 return p.TextBytes(), err
366}
367
368func (s RegisterRequest) SetSystemId(v string) error {
369 return s.Struct.SetText(0, v)
370}
371
372func (s RegisterRequest) Hostname() (string, error) {
373 p, err := s.Struct.Ptr(1)
374 return p.Text(), err
375}
376
377func (s RegisterRequest) HasHostname() bool {
378 return s.Struct.HasPtr(1)
379}
380
381func (s RegisterRequest) HostnameBytes() ([]byte, error) {
382 p, err := s.Struct.Ptr(1)
383 return p.TextBytes(), err
384}
385
386func (s RegisterRequest) SetHostname(v string) error {
387 return s.Struct.SetText(1, v)
388}
389
390func (s RegisterRequest) Interfaces() (Interfaces, error) {
391 p, err := s.Struct.Ptr(2)
392 return Interfaces{Struct: p.Struct()}, err
393}
394
395func (s RegisterRequest) HasInterfaces() bool {
396 return s.Struct.HasPtr(2)
397}
398
399func (s RegisterRequest) SetInterfaces(v Interfaces) error {
400 return s.Struct.SetPtr(2, v.Struct.ToPtr())
401}
402
403// NewInterfaces sets the interfaces field to a newly
404// allocated Interfaces struct, preferring placement in s's segment.
405func (s RegisterRequest) NewInterfaces() (Interfaces, error) {
406 ss, err := NewInterfaces(s.Struct.Segment())
407 if err != nil {
408 return Interfaces{}, err
409 }
410 err = s.Struct.SetPtr(2, ss.Struct.ToPtr())
411 return ss, err
412}
413
414func (s RegisterRequest) Url() (string, error) {
415 p, err := s.Struct.Ptr(3)
416 return p.Text(), err
417}
418
419func (s RegisterRequest) HasUrl() bool {
420 return s.Struct.HasPtr(3)
421}
422
423func (s RegisterRequest) UrlBytes() ([]byte, error) {
424 p, err := s.Struct.Ptr(3)
425 return p.TextBytes(), err
426}
427
428func (s RegisterRequest) SetUrl(v string) error {
429 return s.Struct.SetText(3, v)
430}
431
432func (s RegisterRequest) Nodegroup() (string, error) {
433 p, err := s.Struct.Ptr(4)
434 return p.Text(), err
435}
436
437func (s RegisterRequest) HasNodegroup() bool {
438 return s.Struct.HasPtr(4)
439}
440
441func (s RegisterRequest) NodegroupBytes() ([]byte, error) {
442 p, err := s.Struct.Ptr(4)
443 return p.TextBytes(), err
444}
445
446func (s RegisterRequest) SetNodegroup(v string) error {
447 return s.Struct.SetText(4, v)
448}
449
450func (s RegisterRequest) BeaconSupport() bool {
451 return s.Struct.Bit(0)
452}
453
454func (s RegisterRequest) SetBeaconSupport(v bool) {
455 s.Struct.SetBit(0, v)
456}
457
458func (s RegisterRequest) Version() (string, error) {
459 p, err := s.Struct.Ptr(5)
460 return p.Text(), err
461}
462
463func (s RegisterRequest) HasVersion() bool {
464 return s.Struct.HasPtr(5)
465}
466
467func (s RegisterRequest) VersionBytes() ([]byte, error) {
468 p, err := s.Struct.Ptr(5)
469 return p.TextBytes(), err
470}
471
472func (s RegisterRequest) SetVersion(v string) error {
473 return s.Struct.SetText(5, v)
474}
475
476// RegisterRequest_List is a list of RegisterRequest.
477type RegisterRequest_List struct{ capnp.List }
478
479// NewRegisterRequest creates a new list of RegisterRequest.
480func NewRegisterRequest_List(s *capnp.Segment, sz int32) (RegisterRequest_List, error) {
481 l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 8, PointerCount: 6}, sz)
482 return RegisterRequest_List{l}, err
483}
484
485func (s RegisterRequest_List) At(i int) RegisterRequest { return RegisterRequest{s.List.Struct(i)} }
486
487func (s RegisterRequest_List) Set(i int, v RegisterRequest) error {
488 return s.List.SetStruct(i, v.Struct)
489}
490
491func (s RegisterRequest_List) String() string {
492 str, _ := text.MarshalList(0x8a21a43d866e69f4, s.List)
493 return str
494}
495
496// RegisterRequest_Future is a wrapper for a RegisterRequest promised by a client call.
497type RegisterRequest_Future struct{ *capnp.Future }
498
499func (p RegisterRequest_Future) Struct() (RegisterRequest, error) {
500 s, err := p.Future.Struct()
501 return RegisterRequest{s}, err
502}
503
504func (p RegisterRequest_Future) Interfaces() Interfaces_Future {
505 return Interfaces_Future{Future: p.Future.Field(2, nil)}
506}
507
508type RegisterResponse struct{ capnp.Struct }
509
510// RegisterResponse_TypeID is the unique identifier for the type RegisterResponse.
511const RegisterResponse_TypeID = 0x971fe28893233a11
512
513func NewRegisterResponse(s *capnp.Segment) (RegisterResponse, error) {
514 st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 3})
515 return RegisterResponse{st}, err
516}
517
518func NewRootRegisterResponse(s *capnp.Segment) (RegisterResponse, error) {
519 st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 3})
520 return RegisterResponse{st}, err
521}
522
523func ReadRootRegisterResponse(msg *capnp.Message) (RegisterResponse, error) {
524 root, err := msg.Root()
525 return RegisterResponse{root.Struct()}, err
526}
527
528func (s RegisterResponse) String() string {
529 str, _ := text.Marshal(0x971fe28893233a11, s.Struct)
530 return str
531}
532
533func (s RegisterResponse) SystemId() (string, error) {
534 p, err := s.Struct.Ptr(0)
535 return p.Text(), err
536}
537
538func (s RegisterResponse) HasSystemId() bool {
539 return s.Struct.HasPtr(0)
540}
541
542func (s RegisterResponse) SystemIdBytes() ([]byte, error) {
543 p, err := s.Struct.Ptr(0)
544 return p.TextBytes(), err
545}
546
547func (s RegisterResponse) SetSystemId(v string) error {
548 return s.Struct.SetText(0, v)
549}
550
551func (s RegisterResponse) Uuid() (string, error) {
552 p, err := s.Struct.Ptr(1)
553 return p.Text(), err
554}
555
556func (s RegisterResponse) HasUuid() bool {
557 return s.Struct.HasPtr(1)
558}
559
560func (s RegisterResponse) UuidBytes() ([]byte, error) {
561 p, err := s.Struct.Ptr(1)
562 return p.TextBytes(), err
563}
564
565func (s RegisterResponse) SetUuid(v string) error {
566 return s.Struct.SetText(1, v)
567}
568
569func (s RegisterResponse) Version() (string, error) {
570 p, err := s.Struct.Ptr(2)
571 return p.Text(), err
572}
573
574func (s RegisterResponse) HasVersion() bool {
575 return s.Struct.HasPtr(2)
576}
577
578func (s RegisterResponse) VersionBytes() ([]byte, error) {
579 p, err := s.Struct.Ptr(2)
580 return p.TextBytes(), err
581}
582
583func (s RegisterResponse) SetVersion(v string) error {
584 return s.Struct.SetText(2, v)
585}
586
587// RegisterResponse_List is a list of RegisterResponse.
588type RegisterResponse_List struct{ capnp.List }
589
590// NewRegisterResponse creates a new list of RegisterResponse.
591func NewRegisterResponse_List(s *capnp.Segment, sz int32) (RegisterResponse_List, error) {
592 l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 0, PointerCount: 3}, sz)
593 return RegisterResponse_List{l}, err
594}
595
596func (s RegisterResponse_List) At(i int) RegisterResponse { return RegisterResponse{s.List.Struct(i)} }
597
598func (s RegisterResponse_List) Set(i int, v RegisterResponse) error {
599 return s.List.SetStruct(i, v.Struct)
600}
601
602func (s RegisterResponse_List) String() string {
603 str, _ := text.MarshalList(0x971fe28893233a11, s.List)
604 return str
605}
606
607// RegisterResponse_Future is a wrapper for a RegisterResponse promised by a client call.
608type RegisterResponse_Future struct{ *capnp.Future }
609
610func (p RegisterResponse_Future) Struct() (RegisterResponse, error) {
611 s, err := p.Future.Struct()
612 return RegisterResponse{s}, err
613}
614
615type Registerer struct{ Client *capnp.Client }
616
617// Registerer_TypeID is the unique identifier for the type Registerer.
618const Registerer_TypeID = 0xe75723043cae2d20
619
620func (c Registerer) Register(ctx context.Context, params func(Registerer_register_Params) error) (Registerer_register_Results_Future, capnp.ReleaseFunc) {
621 s := capnp.Send{
622 Method: capnp.Method{
623 InterfaceID: 0xe75723043cae2d20,
624 MethodID: 0,
625 InterfaceName: "handshake.capnp:Registerer",
626 MethodName: "register",
627 },
628 }
629 if params != nil {
630 s.ArgsSize = capnp.ObjectSize{DataSize: 0, PointerCount: 1}
631 s.PlaceArgs = func(s capnp.Struct) error { return params(Registerer_register_Params{Struct: s}) }
632 }
633 ans, release := c.Client.SendCall(ctx, s)
634 return Registerer_register_Results_Future{Future: ans.Future()}, release
635}
636
637func (c Registerer) AddRef() Registerer {
638 return Registerer{
639 Client: c.Client.AddRef(),
640 }
641}
642
643func (c Registerer) Release() {
644 c.Client.Release()
645}
646
647// A Registerer_Server is a Registerer with a local implementation.
648type Registerer_Server interface {
649 Register(context.Context, Registerer_register) error
650}
651
652// Registerer_NewServer creates a new Server from an implementation of Registerer_Server.
653func Registerer_NewServer(s Registerer_Server, policy *server.Policy) *server.Server {
654 c, _ := s.(server.Shutdowner)
655 return server.New(Registerer_Methods(nil, s), s, c, policy)
656}
657
658// Registerer_ServerToClient creates a new Client from an implementation of Registerer_Server.
659// The caller is responsible for calling Release on the returned Client.
660func Registerer_ServerToClient(s Registerer_Server, policy *server.Policy) Registerer {
661 return Registerer{Client: capnp.NewClient(Registerer_NewServer(s, policy))}
662}
663
664// Registerer_Methods appends Methods to a slice that invoke the methods on s.
665// This can be used to create a more complicated Server.
666func Registerer_Methods(methods []server.Method, s Registerer_Server) []server.Method {
667 if cap(methods) == 0 {
668 methods = make([]server.Method, 0, 1)
669 }
670
671 methods = append(methods, server.Method{
672 Method: capnp.Method{
673 InterfaceID: 0xe75723043cae2d20,
674 MethodID: 0,
675 InterfaceName: "handshake.capnp:Registerer",
676 MethodName: "register",
677 },
678 Impl: func(ctx context.Context, call *server.Call) error {
679 return s.Register(ctx, Registerer_register{call})
680 },
681 })
682
683 return methods
684}
685
686// Registerer_register holds the state for a server call to Registerer.register.
687// See server.Call for documentation.
688type Registerer_register struct {
689 *server.Call
690}
691
692// Args returns the call's arguments.
693func (c Registerer_register) Args() Registerer_register_Params {
694 return Registerer_register_Params{Struct: c.Call.Args()}
695}
696
697// AllocResults allocates the results struct.
698func (c Registerer_register) AllocResults() (Registerer_register_Results, error) {
699 r, err := c.Call.AllocResults(capnp.ObjectSize{DataSize: 0, PointerCount: 1})
700 return Registerer_register_Results{Struct: r}, err
701}
702
703type Registerer_register_Params struct{ capnp.Struct }
704
705// Registerer_register_Params_TypeID is the unique identifier for the type Registerer_register_Params.
706const Registerer_register_Params_TypeID = 0x80a0e6cbaa396ef4
707
708func NewRegisterer_register_Params(s *capnp.Segment) (Registerer_register_Params, error) {
709 st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 1})
710 return Registerer_register_Params{st}, err
711}
712
713func NewRootRegisterer_register_Params(s *capnp.Segment) (Registerer_register_Params, error) {
714 st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 1})
715 return Registerer_register_Params{st}, err
716}
717
718func ReadRootRegisterer_register_Params(msg *capnp.Message) (Registerer_register_Params, error) {
719 root, err := msg.Root()
720 return Registerer_register_Params{root.Struct()}, err
721}
722
723func (s Registerer_register_Params) String() string {
724 str, _ := text.Marshal(0x80a0e6cbaa396ef4, s.Struct)
725 return str
726}
727
728func (s Registerer_register_Params) Req() (RegisterRequest, error) {
729 p, err := s.Struct.Ptr(0)
730 return RegisterRequest{Struct: p.Struct()}, err
731}
732
733func (s Registerer_register_Params) HasReq() bool {
734 return s.Struct.HasPtr(0)
735}
736
737func (s Registerer_register_Params) SetReq(v RegisterRequest) error {
738 return s.Struct.SetPtr(0, v.Struct.ToPtr())
739}
740
741// NewReq sets the req field to a newly
742// allocated RegisterRequest struct, preferring placement in s's segment.
743func (s Registerer_register_Params) NewReq() (RegisterRequest, error) {
744 ss, err := NewRegisterRequest(s.Struct.Segment())
745 if err != nil {
746 return RegisterRequest{}, err
747 }
748 err = s.Struct.SetPtr(0, ss.Struct.ToPtr())
749 return ss, err
750}
751
752// Registerer_register_Params_List is a list of Registerer_register_Params.
753type Registerer_register_Params_List struct{ capnp.List }
754
755// NewRegisterer_register_Params creates a new list of Registerer_register_Params.
756func NewRegisterer_register_Params_List(s *capnp.Segment, sz int32) (Registerer_register_Params_List, error) {
757 l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 0, PointerCount: 1}, sz)
758 return Registerer_register_Params_List{l}, err
759}
760
761func (s Registerer_register_Params_List) At(i int) Registerer_register_Params {
762 return Registerer_register_Params{s.List.Struct(i)}
763}
764
765func (s Registerer_register_Params_List) Set(i int, v Registerer_register_Params) error {
766 return s.List.SetStruct(i, v.Struct)
767}
768
769func (s Registerer_register_Params_List) String() string {
770 str, _ := text.MarshalList(0x80a0e6cbaa396ef4, s.List)
771 return str
772}
773
774// Registerer_register_Params_Future is a wrapper for a Registerer_register_Params promised by a client call.
775type Registerer_register_Params_Future struct{ *capnp.Future }
776
777func (p Registerer_register_Params_Future) Struct() (Registerer_register_Params, error) {
778 s, err := p.Future.Struct()
779 return Registerer_register_Params{s}, err
780}
781
782func (p Registerer_register_Params_Future) Req() RegisterRequest_Future {
783 return RegisterRequest_Future{Future: p.Future.Field(0, nil)}
784}
785
786type Registerer_register_Results struct{ capnp.Struct }
787
788// Registerer_register_Results_TypeID is the unique identifier for the type Registerer_register_Results.
789const Registerer_register_Results_TypeID = 0xb5c83b347e16691c
790
791func NewRegisterer_register_Results(s *capnp.Segment) (Registerer_register_Results, error) {
792 st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 1})
793 return Registerer_register_Results{st}, err
794}
795
796func NewRootRegisterer_register_Results(s *capnp.Segment) (Registerer_register_Results, error) {
797 st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 1})
798 return Registerer_register_Results{st}, err
799}
800
801func ReadRootRegisterer_register_Results(msg *capnp.Message) (Registerer_register_Results, error) {
802 root, err := msg.Root()
803 return Registerer_register_Results{root.Struct()}, err
804}
805
806func (s Registerer_register_Results) String() string {
807 str, _ := text.Marshal(0xb5c83b347e16691c, s.Struct)
808 return str
809}
810
811func (s Registerer_register_Results) Resp() (RegisterResponse, error) {
812 p, err := s.Struct.Ptr(0)
813 return RegisterResponse{Struct: p.Struct()}, err
814}
815
816func (s Registerer_register_Results) HasResp() bool {
817 return s.Struct.HasPtr(0)
818}
819
820func (s Registerer_register_Results) SetResp(v RegisterResponse) error {
821 return s.Struct.SetPtr(0, v.Struct.ToPtr())
822}
823
824// NewResp sets the resp field to a newly
825// allocated RegisterResponse struct, preferring placement in s's segment.
826func (s Registerer_register_Results) NewResp() (RegisterResponse, error) {
827 ss, err := NewRegisterResponse(s.Struct.Segment())
828 if err != nil {
829 return RegisterResponse{}, err
830 }
831 err = s.Struct.SetPtr(0, ss.Struct.ToPtr())
832 return ss, err
833}
834
835// Registerer_register_Results_List is a list of Registerer_register_Results.
836type Registerer_register_Results_List struct{ capnp.List }
837
838// NewRegisterer_register_Results creates a new list of Registerer_register_Results.
839func NewRegisterer_register_Results_List(s *capnp.Segment, sz int32) (Registerer_register_Results_List, error) {
840 l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 0, PointerCount: 1}, sz)
841 return Registerer_register_Results_List{l}, err
842}
843
844func (s Registerer_register_Results_List) At(i int) Registerer_register_Results {
845 return Registerer_register_Results{s.List.Struct(i)}
846}
847
848func (s Registerer_register_Results_List) Set(i int, v Registerer_register_Results) error {
849 return s.List.SetStruct(i, v.Struct)
850}
851
852func (s Registerer_register_Results_List) String() string {
853 str, _ := text.MarshalList(0xb5c83b347e16691c, s.List)
854 return str
855}
856
857// Registerer_register_Results_Future is a wrapper for a Registerer_register_Results promised by a client call.
858type Registerer_register_Results_Future struct{ *capnp.Future }
859
860func (p Registerer_register_Results_Future) Struct() (Registerer_register_Results, error) {
861 s, err := p.Future.Struct()
862 return Registerer_register_Results{s}, err
863}
864
865func (p Registerer_register_Results_Future) Resp() RegisterResponse_Future {
866 return RegisterResponse_Future{Future: p.Future.Field(0, nil)}
867}
868
869const schema_dceab81b996ed67b = "x\xda\x8cTM\x88\x1cE\x18}\xaf\xaa\xbb'\x09\xbb" +
870 "\xcc\x14=zI\xe2F\xb3\x07W\xd8%\x92\x04qU" +
871 "6F%\xc9\xa2\xb8\xb51(\xb9uf\xca\xdd1;" +
872 "=\x93\xae\x1e%\xc6\x9f\x10QTPQ\xc1?<\x08" +
873 "\x8a\x82\x88z0\xa0\xa0\x12\xc1\xc0\x82\x04\x12\x10\x7f\xe2" +
874 "^\xa2!J\xc0\x8b\xe4\xe2AZj\xdc\xe9\xe9L\x0c" +
875 "\xd9[\xd7\xc7\xeb\xf7\xbd\xef\xbd\xaao\xd3Ub\x9b\xb8" +
876 "\xd1\xbf)\x00\xf4N?\xc8^\xfc\xe6\xd0\xa3\x1f\xfc\xb6" +
877 "\xe60TEf\x87~\x88\xdf\\\xfb\xf9\xf9%\x80!" +
878 "\xe5_\xe1\xb0,\x01\xe1j\xb9#\xdc\xea\xbe\xb2\x0b\xf1" +
879 "\xcd\x1f~w\xee\x9d\xc3Pk\x09\xf8,\x01\x9b\xd7\xcb" +
880 "\xbd\x04\xc319\x05f\x17\x1a\xf13\xb7\xbdw\xed\xf3" +
881 "\xd0\x15\xb2O\xe7\x07\x0e\xb9K\x0a\x86{\x1c\xd1f-" +
882 "_\"\x98m?\xf8\xdcS\xe7\x1e;\xf6\x1a\xd459" +
883 "\xdf\x9f\xde[\x8e\xef\x1f\xcf\xf1\xa9\xc9\x8d\xaf>\xfb\xeb" +
884 "\xc8\xebP\x95\"]\x97c\xbd\xbf\x86\xe1\xb8\xef\x14\x8e" +
885 "\xf9\x9f\x80\xd9\x99\xb3\x1b~<2\xf5\xe9\x1b\x03`\xe1" +
886 "\x10\xc7\xfd\xf3\xe1\xa9.\xf6\x84\xff\x08\x98\xadk\\\xfd" +
887 "\xc4\x96[\x16\x8f\x16'\x19\x0b\xf6\xb9\xce[\x03\xd7y" +
888 "\xf7\xfb\xd9\xe9\xaf\xdf\xfd\xe8\x97\xa2\xb4=\xc1+\x0e`" +
889 "\xba\x80\x0d\xe3\x1f\xdf\xeam\xbc\xff\xf7K\x8c{:8" +
890 "\x1d\xbe\xec\x06\x0e_\x08v\x84_\x04%\xd4\xb2\xf9(" +
891 "\xae\xdb\xf9h\xbf0\x13\xb5\xa8\x1d\xb7'o\xef\xa4\xf3" +
892 "&N\x1b#\xb5(m%3\xa4\xf6\xa4\x0f\xe4m\xd9" +
893 "\xb3F\xa9\x87 \xd4\xeaR\x16-\xff\x81r-J\xcd" +
894 "6\xce\x909\xad\xd7\xa3\x9d5s\x0d\x9b\x9a\xc4$\x13" +
895 "\xc9\xf2\xe7\xe8L\x94D\xb2i\xb5'=\xc0#\xa0\x86" +
896 "\xaf\x03\xf4*I]\x15,%\xe6\x00+\xfd\xe0@V" +
897 "\xd0g\x96\x83\xcc\xb3\xe6@\xc7\xd8\x14N\xf2\xba\x9c\xf1" +
898 "\xe84\xa0?\x93\xd4\xc7\x04\x15Y\xa5+~\xe5\x8a_" +
899 "J\xeaEA%D\x95\x02P\xc7\xf7\x02\xfa[I}" +
900 "RPIY\xa5\x04\xd4\x09'hQR\x7f/\xa8<" +
901 "\xafJ\x0fP\xa7f\x01}RR/\x09\xd2\xaf\xd2\x07" +
902 "\xd4\xcf\x09\xa0\x7f\x92\xd4g\x05U\xe0W\x19\x00\xea\xcc" +
903 "v@/I\xea?\x043{\xd0\xa6\xa6\xb9\xab\x0e\x80" +
904 "C\x10\x1cr\xc3\xb4l\x1aGMS\xac5\xe2\xd4$" +
905 "\x0fF5HcY\xc9\xee\x98~\xfc\xef{\xdf\xde\x7f" +
906 "dy\xfeR'Y\xc8\xa1q\xabn\xe6\x92V\x07l" +
907 "\xe7\xb5}&\xaa\xb5\xe2\xdd\x1d\x8c\xb4\xdb\xad$%!" +
908 "H\xf0\xc9\x87Mb\x1b\xad\xb8\xdfz\xd9G\x7f0\xf8" +
909 "n\xee\x13Q\xffdFg\x8d\xed,\xc8\xf4\xa2\xa4n" +
910 "\xe8'UN\x8cm\xb3\xd2\xbf\xe6W\x8e\xca\xb6[\xb1" +
911 "5\xe8\x865\x94\x93\xde\xe5r\xb9SR\xcf\x14\xc2\xba" +
912 "\xc7u\xda)\xa9\xef+\x84\xa5\x9d\xb3wK\xea\x07\xfe" +
913 "\xdf\xd9r\xa7\xd3\xa8\xf7\x0e\x97\x9d\xfd\xa2K\xefD\x95" +
914 "\x9d*\xa7iU\xaei\xcc\xb5\x1f\x95\xd4\x9b\x0a\x9a\xc6" +
915 "'\x01}\xbd\xa4\xde\"X\xb6\xd1B\xcaa\x08\x0e\x83" +
916 "S\xf5\xc6\x9c\xb1\xf9qe\xef\xc0\xd9[Z\xb8\xa2\xbd" +
917 "\xf9\xca\x19\xb0w%\x09\xba\xa7\xd6\xe4e\x9fZ\xd3\xce" +
918 "]\"Y\x0cJ\x96\xa6\xb0\x0ez\x0b\x97\xbd}\xa5\xd4" +
919 "\xf4\x7f\xeb\xa07\x16\x80\xee.\xf87\x00\x00\xff\xff\x86" +
920 "\xdc\x84m"
921
922func init() {
923 schemas.Register(schema_dceab81b996ed67b,
924 0x800ae3a77a7bc18e,
925 0x80a0e6cbaa396ef4,
926 0x8a21a43d866e69f4,
927 0x96c07ce683897942,
928 0x971fe28893233a11,
929 0x98b03f82d720e4e1,
930 0xb5c83b347e16691c,
931 0xdbaca3bedaffa653,
932 0xe75723043cae2d20)
933}
diff --git a/src/rackd_spike/pkg/rpc/network.capnp.go b/src/rackd_spike/pkg/rpc/network.capnp.go
0new file mode 100644934new file mode 100644
index 0000000..4101c19
--- /dev/null
+++ b/src/rackd_spike/pkg/rpc/network.capnp.go
@@ -0,0 +1,489 @@
1// Code generated by capnpc-go. DO NOT EDIT.
2
3package rpc
4
5import (
6 capnp "capnproto.org/go/capnp/v3"
7 text "capnproto.org/go/capnp/v3/encoding/text"
8 schemas "capnproto.org/go/capnp/v3/schemas"
9)
10
11type Link struct{ capnp.Struct }
12
13// Link_TypeID is the unique identifier for the type Link.
14const Link_TypeID = 0xc7251b7c2c125e6e
15
16func NewLink(s *capnp.Segment) (Link, error) {
17 st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 8, PointerCount: 3})
18 return Link{st}, err
19}
20
21func NewRootLink(s *capnp.Segment) (Link, error) {
22 st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 8, PointerCount: 3})
23 return Link{st}, err
24}
25
26func ReadRootLink(msg *capnp.Message) (Link, error) {
27 root, err := msg.Root()
28 return Link{root.Struct()}, err
29}
30
31func (s Link) String() string {
32 str, _ := text.Marshal(0xc7251b7c2c125e6e, s.Struct)
33 return str
34}
35
36func (s Link) Mode() (string, error) {
37 p, err := s.Struct.Ptr(0)
38 return p.Text(), err
39}
40
41func (s Link) HasMode() bool {
42 return s.Struct.HasPtr(0)
43}
44
45func (s Link) ModeBytes() ([]byte, error) {
46 p, err := s.Struct.Ptr(0)
47 return p.TextBytes(), err
48}
49
50func (s Link) SetMode(v string) error {
51 return s.Struct.SetText(0, v)
52}
53
54func (s Link) Address() (string, error) {
55 p, err := s.Struct.Ptr(1)
56 return p.Text(), err
57}
58
59func (s Link) HasAddress() bool {
60 return s.Struct.HasPtr(1)
61}
62
63func (s Link) AddressBytes() ([]byte, error) {
64 p, err := s.Struct.Ptr(1)
65 return p.TextBytes(), err
66}
67
68func (s Link) SetAddress(v string) error {
69 return s.Struct.SetText(1, v)
70}
71
72func (s Link) Gateway() (string, error) {
73 p, err := s.Struct.Ptr(2)
74 return p.Text(), err
75}
76
77func (s Link) HasGateway() bool {
78 return s.Struct.HasPtr(2)
79}
80
81func (s Link) GatewayBytes() ([]byte, error) {
82 p, err := s.Struct.Ptr(2)
83 return p.TextBytes(), err
84}
85
86func (s Link) SetGateway(v string) error {
87 return s.Struct.SetText(2, v)
88}
89
90func (s Link) Netmask() int32 {
91 return int32(s.Struct.Uint32(0))
92}
93
94func (s Link) SetNetmask(v int32) {
95 s.Struct.SetUint32(0, uint32(v))
96}
97
98// Link_List is a list of Link.
99type Link_List struct{ capnp.List }
100
101// NewLink creates a new list of Link.
102func NewLink_List(s *capnp.Segment, sz int32) (Link_List, error) {
103 l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 8, PointerCount: 3}, sz)
104 return Link_List{l}, err
105}
106
107func (s Link_List) At(i int) Link { return Link{s.List.Struct(i)} }
108
109func (s Link_List) Set(i int, v Link) error { return s.List.SetStruct(i, v.Struct) }
110
111func (s Link_List) String() string {
112 str, _ := text.MarshalList(0xc7251b7c2c125e6e, s.List)
113 return str
114}
115
116// Link_Future is a wrapper for a Link promised by a client call.
117type Link_Future struct{ *capnp.Future }
118
119func (p Link_Future) Struct() (Link, error) {
120 s, err := p.Future.Struct()
121 return Link{s}, err
122}
123
124type InterfaceDetails struct{ capnp.Struct }
125
126// InterfaceDetails_TypeID is the unique identifier for the type InterfaceDetails.
127const InterfaceDetails_TypeID = 0xca5e2a006234f169
128
129func NewInterfaceDetails(s *capnp.Segment) (InterfaceDetails, error) {
130 st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 16, PointerCount: 4})
131 return InterfaceDetails{st}, err
132}
133
134func NewRootInterfaceDetails(s *capnp.Segment) (InterfaceDetails, error) {
135 st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 16, PointerCount: 4})
136 return InterfaceDetails{st}, err
137}
138
139func ReadRootInterfaceDetails(msg *capnp.Message) (InterfaceDetails, error) {
140 root, err := msg.Root()
141 return InterfaceDetails{root.Struct()}, err
142}
143
144func (s InterfaceDetails) String() string {
145 str, _ := text.Marshal(0xca5e2a006234f169, s.Struct)
146 return str
147}
148
149func (s InterfaceDetails) MacAddress() (string, error) {
150 p, err := s.Struct.Ptr(0)
151 return p.Text(), err
152}
153
154func (s InterfaceDetails) HasMacAddress() bool {
155 return s.Struct.HasPtr(0)
156}
157
158func (s InterfaceDetails) MacAddressBytes() ([]byte, error) {
159 p, err := s.Struct.Ptr(0)
160 return p.TextBytes(), err
161}
162
163func (s InterfaceDetails) SetMacAddress(v string) error {
164 return s.Struct.SetText(0, v)
165}
166
167func (s InterfaceDetails) Type() (string, error) {
168 p, err := s.Struct.Ptr(1)
169 return p.Text(), err
170}
171
172func (s InterfaceDetails) HasType() bool {
173 return s.Struct.HasPtr(1)
174}
175
176func (s InterfaceDetails) TypeBytes() ([]byte, error) {
177 p, err := s.Struct.Ptr(1)
178 return p.TextBytes(), err
179}
180
181func (s InterfaceDetails) SetType(v string) error {
182 return s.Struct.SetText(1, v)
183}
184
185func (s InterfaceDetails) Links() (Link_List, error) {
186 p, err := s.Struct.Ptr(2)
187 return Link_List{List: p.List()}, err
188}
189
190func (s InterfaceDetails) HasLinks() bool {
191 return s.Struct.HasPtr(2)
192}
193
194func (s InterfaceDetails) SetLinks(v Link_List) error {
195 return s.Struct.SetPtr(2, v.List.ToPtr())
196}
197
198// NewLinks sets the links field to a newly
199// allocated Link_List, preferring placement in s's segment.
200func (s InterfaceDetails) NewLinks(n int32) (Link_List, error) {
201 l, err := NewLink_List(s.Struct.Segment(), n)
202 if err != nil {
203 return Link_List{}, err
204 }
205 err = s.Struct.SetPtr(2, l.List.ToPtr())
206 return l, err
207}
208
209func (s InterfaceDetails) Vid() uint64 {
210 return s.Struct.Uint64(0)
211}
212
213func (s InterfaceDetails) SetVid(v uint64) {
214 s.Struct.SetUint64(0, v)
215}
216
217func (s InterfaceDetails) Enabled() bool {
218 return s.Struct.Bit(64)
219}
220
221func (s InterfaceDetails) SetEnabled(v bool) {
222 s.Struct.SetBit(64, v)
223}
224
225func (s InterfaceDetails) Parents() (capnp.TextList, error) {
226 p, err := s.Struct.Ptr(3)
227 return capnp.TextList{List: p.List()}, err
228}
229
230func (s InterfaceDetails) HasParents() bool {
231 return s.Struct.HasPtr(3)
232}
233
234func (s InterfaceDetails) SetParents(v capnp.TextList) error {
235 return s.Struct.SetPtr(3, v.List.ToPtr())
236}
237
238// NewParents sets the parents field to a newly
239// allocated capnp.TextList, preferring placement in s's segment.
240func (s InterfaceDetails) NewParents(n int32) (capnp.TextList, error) {
241 l, err := capnp.NewTextList(s.Struct.Segment(), n)
242 if err != nil {
243 return capnp.TextList{}, err
244 }
245 err = s.Struct.SetPtr(3, l.List.ToPtr())
246 return l, err
247}
248
249// InterfaceDetails_List is a list of InterfaceDetails.
250type InterfaceDetails_List struct{ capnp.List }
251
252// NewInterfaceDetails creates a new list of InterfaceDetails.
253func NewInterfaceDetails_List(s *capnp.Segment, sz int32) (InterfaceDetails_List, error) {
254 l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 16, PointerCount: 4}, sz)
255 return InterfaceDetails_List{l}, err
256}
257
258func (s InterfaceDetails_List) At(i int) InterfaceDetails { return InterfaceDetails{s.List.Struct(i)} }
259
260func (s InterfaceDetails_List) Set(i int, v InterfaceDetails) error {
261 return s.List.SetStruct(i, v.Struct)
262}
263
264func (s InterfaceDetails_List) String() string {
265 str, _ := text.MarshalList(0xca5e2a006234f169, s.List)
266 return str
267}
268
269// InterfaceDetails_Future is a wrapper for a InterfaceDetails promised by a client call.
270type InterfaceDetails_Future struct{ *capnp.Future }
271
272func (p InterfaceDetails_Future) Struct() (InterfaceDetails, error) {
273 s, err := p.Future.Struct()
274 return InterfaceDetails{s}, err
275}
276
277type Interface struct{ capnp.Struct }
278
279// Interface_TypeID is the unique identifier for the type Interface.
280const Interface_TypeID = 0x929a2663d1c662e2
281
282func NewInterface(s *capnp.Segment) (Interface, error) {
283 st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 2})
284 return Interface{st}, err
285}
286
287func NewRootInterface(s *capnp.Segment) (Interface, error) {
288 st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 2})
289 return Interface{st}, err
290}
291
292func ReadRootInterface(msg *capnp.Message) (Interface, error) {
293 root, err := msg.Root()
294 return Interface{root.Struct()}, err
295}
296
297func (s Interface) String() string {
298 str, _ := text.Marshal(0x929a2663d1c662e2, s.Struct)
299 return str
300}
301
302func (s Interface) Name() (string, error) {
303 p, err := s.Struct.Ptr(0)
304 return p.Text(), err
305}
306
307func (s Interface) HasName() bool {
308 return s.Struct.HasPtr(0)
309}
310
311func (s Interface) NameBytes() ([]byte, error) {
312 p, err := s.Struct.Ptr(0)
313 return p.TextBytes(), err
314}
315
316func (s Interface) SetName(v string) error {
317 return s.Struct.SetText(0, v)
318}
319
320func (s Interface) Iface() (InterfaceDetails, error) {
321 p, err := s.Struct.Ptr(1)
322 return InterfaceDetails{Struct: p.Struct()}, err
323}
324
325func (s Interface) HasIface() bool {
326 return s.Struct.HasPtr(1)
327}
328
329func (s Interface) SetIface(v InterfaceDetails) error {
330 return s.Struct.SetPtr(1, v.Struct.ToPtr())
331}
332
333// NewIface sets the iface field to a newly
334// allocated InterfaceDetails struct, preferring placement in s's segment.
335func (s Interface) NewIface() (InterfaceDetails, error) {
336 ss, err := NewInterfaceDetails(s.Struct.Segment())
337 if err != nil {
338 return InterfaceDetails{}, err
339 }
340 err = s.Struct.SetPtr(1, ss.Struct.ToPtr())
341 return ss, err
342}
343
344// Interface_List is a list of Interface.
345type Interface_List struct{ capnp.List }
346
347// NewInterface creates a new list of Interface.
348func NewInterface_List(s *capnp.Segment, sz int32) (Interface_List, error) {
349 l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 0, PointerCount: 2}, sz)
350 return Interface_List{l}, err
351}
352
353func (s Interface_List) At(i int) Interface { return Interface{s.List.Struct(i)} }
354
355func (s Interface_List) Set(i int, v Interface) error { return s.List.SetStruct(i, v.Struct) }
356
357func (s Interface_List) String() string {
358 str, _ := text.MarshalList(0x929a2663d1c662e2, s.List)
359 return str
360}
361
362// Interface_Future is a wrapper for a Interface promised by a client call.
363type Interface_Future struct{ *capnp.Future }
364
365func (p Interface_Future) Struct() (Interface, error) {
366 s, err := p.Future.Struct()
367 return Interface{s}, err
368}
369
370func (p Interface_Future) Iface() InterfaceDetails_Future {
371 return InterfaceDetails_Future{Future: p.Future.Field(1, nil)}
372}
373
374type Interfaces struct{ capnp.Struct }
375
376// Interfaces_TypeID is the unique identifier for the type Interfaces.
377const Interfaces_TypeID = 0x826b9c4ff97d4a43
378
379func NewInterfaces(s *capnp.Segment) (Interfaces, error) {
380 st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 1})
381 return Interfaces{st}, err
382}
383
384func NewRootInterfaces(s *capnp.Segment) (Interfaces, error) {
385 st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 1})
386 return Interfaces{st}, err
387}
388
389func ReadRootInterfaces(msg *capnp.Message) (Interfaces, error) {
390 root, err := msg.Root()
391 return Interfaces{root.Struct()}, err
392}
393
394func (s Interfaces) String() string {
395 str, _ := text.Marshal(0x826b9c4ff97d4a43, s.Struct)
396 return str
397}
398
399func (s Interfaces) Ifaces() (Interface_List, error) {
400 p, err := s.Struct.Ptr(0)
401 return Interface_List{List: p.List()}, err
402}
403
404func (s Interfaces) HasIfaces() bool {
405 return s.Struct.HasPtr(0)
406}
407
408func (s Interfaces) SetIfaces(v Interface_List) error {
409 return s.Struct.SetPtr(0, v.List.ToPtr())
410}
411
412// NewIfaces sets the ifaces field to a newly
413// allocated Interface_List, preferring placement in s's segment.
414func (s Interfaces) NewIfaces(n int32) (Interface_List, error) {
415 l, err := NewInterface_List(s.Struct.Segment(), n)
416 if err != nil {
417 return Interface_List{}, err
418 }
419 err = s.Struct.SetPtr(0, l.List.ToPtr())
420 return l, err
421}
422
423// Interfaces_List is a list of Interfaces.
424type Interfaces_List struct{ capnp.List }
425
426// NewInterfaces creates a new list of Interfaces.
427func NewInterfaces_List(s *capnp.Segment, sz int32) (Interfaces_List, error) {
428 l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 0, PointerCount: 1}, sz)
429 return Interfaces_List{l}, err
430}
431
432func (s Interfaces_List) At(i int) Interfaces { return Interfaces{s.List.Struct(i)} }
433
434func (s Interfaces_List) Set(i int, v Interfaces) error { return s.List.SetStruct(i, v.Struct) }
435
436func (s Interfaces_List) String() string {
437 str, _ := text.MarshalList(0x826b9c4ff97d4a43, s.List)
438 return str
439}
440
441// Interfaces_Future is a wrapper for a Interfaces promised by a client call.
442type Interfaces_Future struct{ *capnp.Future }
443
444func (p Interfaces_Future) Struct() (Interfaces, error) {
445 s, err := p.Future.Struct()
446 return Interfaces{s}, err
447}
448
449const schema_dae346a935a6f239 = "x\xda|\x921h\x14O\x18\xc5\xdf\x9b\xd9\xfb'\x81" +
450 "\xfc/\xb7\xde\x15\x82\x85\"Q4\x18\x89\x1a\x0b\xd3$" +
451 "F\x11\"\x82\xf9\x0a\x11D\x82\x93\xdb\xd1,w\xb79" +
452 "\xee\x16C@9\x14,l\xad4\xa4PP\xd1\xde\xc2" +
453 "@\x04#j \x9d\x9d\xd8\xa9\x88X\x89v\xda\xac\xcc" +
454 "\x06\xf7\x16A\xbb\x9d\xc7o\xbf\xf7\xde|32\xc9\x09" +
455 "u\xa0\xb0\xae\x00\xd9Q\xf8/9v\xf2\xea\x8f\xd3\xcb" +
456 "\xb5\xeb\xf0\x8bL\x8e|\x7fx\xf8\xf1\x89\x8f\xefP`" +
457 "\x0fP\x9e\xe2F\xf9L\xfa%\x1c\x07\x93\x0f\xb3\xaf\xdf" +
458 "Tw/\xdd\xfa\x83U\x8e\xb8\xc6\x17\xe5\x9b){\x83" +
459 "\x0b`\x12\xcdl\xd9we\xdb\xaeuH\x91yX;" +
460 "\xe4=\x97\xca_R\xf8\x13?\x83_\xc3o\xa3\xb3C" +
461 "3\x1bR\xa4\xca\xa1\x9e\x03V\xd4\xcf\xf2+\xe7ph" +
462 "M\x9d%\x86\x93\xc8\xc6\x0b\xf3\xad\xda~U5\xcd\xa8" +
463 "96\x15\xc5\xb6u\xd1Tm\x1b\x98&\xc5\xd3\x1e\xe0" +
464 "\x11\xf0\xff\x1f\x03\xa4WS\x06\x15\xc7\xc3\x14a\x11\x9c" +
465 "\xd6d\xa9[\x05t\xe2_\xa7\xa63{\xb3\x99{\x87" +
466 "\x00\x19\xd4\x94\x11E\x9f\xac\xd0\x89\xc3\x07\x01\xd9\xa3)" +
467 "\xa3\x8a\x03\x91iX\xf6C\xb1\x1f\xdc\x9e\xba\xb2\xf4\xbb" +
468 "\x1f\xc8R\xce\x8b\x9b^\xa7B\x1d\xd5\x9cM)\xb31" +
469 "\xce\xe6\xbc\xa6\xcc\xe5l\xec$ \x174\xa5\xae\xe8+" +
470 "U\xa1\x02\xfc\xd0\x89\x81\xa64\x15\xa9+\xd4\x80\xdfp" +
471 "\xda\x9c\xa6\xc4\x8a\x03\x8d\xf9 \xcb\xd31A\xd0\xb2\xed" +
472 "vv\xbedb\xbb`\x16\xb3sd\xe3\x86i\xd7\xe8" +
473 "A\xd1\xfb\xc7\xad\x1c\x1f\xb7\xb1\x09\xebm\x97zk\x96" +
474 "\xfa\xce9@nk\xca\xfd\\\xea{\xae\xca\xb2\xa6<" +
475 "\xca\xa5~\xe0n\xec\xae\xa6\xacvS\xaf\xec\x04\xe4\x89" +
476 "\xa6<W\xf4\xbd\x89\x0a=\xc0\x7f\xe6\xaa<\xd5\x94\x97" +
477 "\x8a~AWX\x00\xfc5'\xaej\xca[\xc5\xa4a" +
478 "\xaaG]+\xe8n\xaf\x81x\xb1\xd9]B=\x8cj" +
479 "\xb9\xcdg\x0fss\xf3=\x97\xc3\x80}P\xec\x03;" +
480 "62\xb3u\x1b\x90P$\xd8i\x9a\x96\x8d\xe2\xecg" +
481 "7\xb1\x08\xfe\x0a\x00\x00\xff\xff\x8c{\xba\xe7"
482
483func init() {
484 schemas.Register(schema_dae346a935a6f239,
485 0x826b9c4ff97d4a43,
486 0x929a2663d1c662e2,
487 0xc7251b7c2c125e6e,
488 0xca5e2a006234f169)
489}
diff --git a/src/rpc/go.capnp b/src/rpc/go.capnp
0new file mode 100644490new file mode 100644
index 0000000..4072b57
--- /dev/null
+++ b/src/rpc/go.capnp
@@ -0,0 +1,27 @@
1@0xd12a1c51fedd6c88;
2
3annotation package(file) :Text;
4# The Go package name for the generated file.
5
6annotation import(file) :Text;
7# The Go import path that the generated file is accessible from.
8# Used to generate import statements and check if two types are in the
9# same package.
10
11annotation doc(struct, field, enum) :Text;
12# Adds a doc comment to the generated code.
13
14annotation tag(enumerant) :Text;
15# Changes the string representation of the enum in the generated code.
16
17annotation notag(enumerant) :Void;
18# Removes the string representation of the enum in the generated code.
19
20annotation customtype(field) :Text;
21# OBSOLETE, not used by code generator.
22
23annotation name(struct, field, union, enum, enumerant, interface, method, param, annotation, const, group) :Text;
24# Used to rename the element in the generated code.
25
26$package("gocp");
27$import("capnproto.org/go/capnp/v3/std/go");
diff --git a/src/rpc/handshake.capnp b/src/rpc/handshake.capnp
0new file mode 10064428new file mode 100644
index 0000000..dc87b67
--- /dev/null
+++ b/src/rpc/handshake.capnp
@@ -0,0 +1,36 @@
1@0xdceab81b996ed67b;
2
3using Go = import "go.capnp";
4$Go.package("rpc");
5$Go.import("rpc");
6
7using Network = import "network.capnp";
8
9struct AuthResponse {
10 salt @0 :Data;
11 digest @1 :Data;
12}
13
14interface Authenticator {
15 authenticate @0 (msg :Data) -> (resp :AuthResponse);
16}
17
18struct RegisterRequest {
19 systemId @0 :Text;
20 hostname @1 :Text;
21 interfaces @2 :Network.Interfaces;
22 url @3 :Text;
23 nodegroup @4 :Text;
24 beaconSupport @5 :Bool;
25 version @6 :Text;
26}
27
28struct RegisterResponse {
29 systemId @0 :Text;
30 uuid @1 :Text;
31 version @2 :Text;
32}
33
34interface Registerer {
35 register @0 (req :RegisterRequest) -> (resp :RegisterResponse);
36}
diff --git a/src/rpc/network.capnp b/src/rpc/network.capnp
0new file mode 10064437new file mode 100644
index 0000000..5e719c9
--- /dev/null
+++ b/src/rpc/network.capnp
@@ -0,0 +1,30 @@
1@0xdae346a935a6f239;
2
3using Go = import "go.capnp";
4$Go.package("rpc");
5$Go.import("rpc");
6
7struct Link {
8 mode @0 :Text;
9 address @1 :Text;
10 gateway @2 :Text;
11 netmask @3 :Int32;
12}
13
14struct InterfaceDetails {
15 macAddress @0 :Text;
16 type @1 :Text;
17 links @2 :List(Link);
18 vid @3 :UInt64;
19 enabled @4 :Bool;
20 parents @5 :List(Text);
21}
22
23struct Interface {
24 name @0 :Text;
25 iface @1 :InterfaceDetails;
26}
27
28struct Interfaces {
29 ifaces @0 :List(Interface);
30}

Subscribers

People subscribed via source and target branches