@agoric/cosmos 0.34.2-orchestration-dev-096c4e8.0 → 0.34.2-other-dev-3eb1a1d.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MAINTAINERS.md +3 -0
- package/Makefile +38 -34
- package/ante/ante.go +1 -4
- package/ante/inbound_test.go +2 -2
- package/app/app.go +198 -137
- package/app/upgrade.go +248 -0
- package/cmd/agd/agvm.go +3 -3
- package/cmd/agd/find_binary.go +2 -2
- package/cmd/agd/main.go +9 -10
- package/cmd/libdaemon/main.go +13 -13
- package/daemon/cmd/root.go +235 -92
- package/daemon/cmd/root_test.go +189 -1
- package/daemon/main.go +3 -2
- package/git-revision.txt +1 -1
- package/go.mod +14 -11
- package/go.sum +20 -19
- package/index.cjs +1 -1
- package/package.json +4 -3
- package/proto/agoric/swingset/genesis.proto +4 -0
- package/proto/agoric/swingset/swingset.proto +26 -1
- package/proto/agoric/vbank/vbank.proto +7 -0
- package/proto/agoric/vtransfer/genesis.proto +18 -0
- package/scripts/protocgen.sh +7 -8
- package/types/kv_entry_helpers.go +42 -0
- package/upgradegaia.sh +8 -8
- package/util/util.go +21 -0
- package/vm/action.go +1 -1
- package/vm/client.go +15 -13
- package/vm/client_test.go +34 -36
- package/vm/controller.go +3 -38
- package/vm/core_proposals.go +22 -2
- package/vm/proto_json.go +38 -0
- package/vm/proto_json_test.go +103 -0
- package/vm/server.go +106 -5
- package/x/swingset/alias.go +2 -0
- package/x/swingset/config.go +234 -0
- package/x/swingset/genesis.go +178 -40
- package/x/swingset/keeper/extension_snapshotter.go +2 -2
- package/x/swingset/keeper/keeper.go +24 -27
- package/x/swingset/keeper/swing_store_exports_handler.go +14 -3
- package/x/swingset/keeper/test_utils.go +16 -0
- package/x/swingset/module.go +24 -9
- package/x/swingset/testing/queue.go +17 -0
- package/x/swingset/types/default-params.go +31 -5
- package/x/swingset/types/expected_keepers.go +2 -2
- package/x/swingset/types/genesis.pb.go +78 -25
- package/x/swingset/types/msgs.go +53 -12
- package/x/swingset/types/params.go +53 -43
- package/x/swingset/types/params_test.go +75 -9
- package/x/swingset/types/swingset.pb.go +387 -57
- package/x/vbank/README.md +6 -1
- package/x/vbank/genesis.go +0 -2
- package/x/vbank/keeper/keeper.go +4 -9
- package/x/vbank/keeper/migrations.go +30 -0
- package/x/vbank/module.go +8 -7
- package/x/vbank/types/key.go +3 -3
- package/x/vbank/types/msgs.go +0 -12
- package/x/vbank/types/params.go +43 -2
- package/x/vbank/types/vbank.pb.go +105 -36
- package/x/vbank/vbank.go +8 -13
- package/x/vbank/vbank_test.go +14 -9
- package/x/vibc/alias.go +1 -1
- package/x/vibc/module.go +2 -7
- package/x/vibc/types/ibc_module.go +9 -3
- package/x/vibc/types/receiver.go +17 -7
- package/x/vlocalchain/handler.go +2 -1
- package/x/vlocalchain/keeper/keeper.go +24 -8
- package/x/vlocalchain/keeper/keeper_test.go +65 -1
- package/x/vlocalchain/types/expected_keepers.go +12 -0
- package/x/vlocalchain/vlocalchain.go +27 -22
- package/x/vlocalchain/vlocalchain_test.go +163 -8
- package/x/vstorage/keeper/grpc_query.go +0 -1
- package/x/vstorage/keeper/keeper.go +9 -17
- package/x/vstorage/module.go +0 -5
- package/x/vstorage/testing/queue.go +28 -0
- package/x/vtransfer/alias.go +13 -0
- package/x/vtransfer/genesis.go +39 -0
- package/x/vtransfer/genesis_test.go +12 -0
- package/x/vtransfer/handler.go +20 -0
- package/x/vtransfer/ibc_middleware.go +186 -0
- package/x/vtransfer/ibc_middleware_test.go +449 -0
- package/x/vtransfer/keeper/keeper.go +282 -0
- package/x/vtransfer/module.go +124 -0
- package/x/vtransfer/types/baseaddr.go +156 -0
- package/x/vtransfer/types/baseaddr_test.go +167 -0
- package/x/vtransfer/types/expected_keepers.go +38 -0
- package/x/vtransfer/types/genesis.pb.go +328 -0
- package/x/vtransfer/types/key.go +9 -0
- package/x/vtransfer/types/msgs.go +9 -0
- package/ante/fee.go +0 -97
package/app/upgrade.go
ADDED
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
package gaia
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"encoding/json"
|
|
5
|
+
"fmt"
|
|
6
|
+
"strings"
|
|
7
|
+
"text/template"
|
|
8
|
+
|
|
9
|
+
"github.com/Agoric/agoric-sdk/golang/cosmos/vm"
|
|
10
|
+
swingsetkeeper "github.com/Agoric/agoric-sdk/golang/cosmos/x/swingset/keeper"
|
|
11
|
+
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
12
|
+
"github.com/cosmos/cosmos-sdk/types/module"
|
|
13
|
+
upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
var upgradeNamesOfThisVersion = []string{
|
|
17
|
+
"UNRELEASED_BASIC", // no-frills
|
|
18
|
+
"UNRELEASED_A3P_INTEGRATION",
|
|
19
|
+
"UNRELEASED_main",
|
|
20
|
+
"UNRELEASED_devnet",
|
|
21
|
+
"UNRELEASED_emerynet",
|
|
22
|
+
"UNRELEASED_REAPPLY",
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// isUpgradeNameOfThisVersion returns whether the provided plan name is a
|
|
26
|
+
// known upgrade name of this software version
|
|
27
|
+
func isUpgradeNameOfThisVersion(name string) bool {
|
|
28
|
+
for _, upgradeName := range upgradeNamesOfThisVersion {
|
|
29
|
+
if upgradeName == name {
|
|
30
|
+
return true
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return false
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// validUpgradeName is an identity function that asserts the provided name
|
|
37
|
+
// is an upgrade name of this software version. It can be used as a sort of
|
|
38
|
+
// dynamic enum check.
|
|
39
|
+
func validUpgradeName(name string) string {
|
|
40
|
+
if !isUpgradeNameOfThisVersion(name) {
|
|
41
|
+
panic(fmt.Errorf("invalid upgrade name: %s", name))
|
|
42
|
+
}
|
|
43
|
+
return name
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// isPrimaryUpgradeName returns wether the provided plan name is considered a
|
|
47
|
+
// primary for the purpose of applying store migrations for the first upgrade
|
|
48
|
+
// of this version.
|
|
49
|
+
// It is expected that only primary plan names are used for non testing chains.
|
|
50
|
+
func isPrimaryUpgradeName(name string) bool {
|
|
51
|
+
if name == "" {
|
|
52
|
+
// An empty upgrade name can happen if there are no upgrade in progress
|
|
53
|
+
return false
|
|
54
|
+
}
|
|
55
|
+
switch name {
|
|
56
|
+
case validUpgradeName("UNRELEASED_BASIC"),
|
|
57
|
+
validUpgradeName("UNRELEASED_A3P_INTEGRATION"),
|
|
58
|
+
validUpgradeName("UNRELEASED_main"),
|
|
59
|
+
validUpgradeName("UNRELEASED_devnet"),
|
|
60
|
+
validUpgradeName("UNRELEASED_emerynet"):
|
|
61
|
+
return true
|
|
62
|
+
case validUpgradeName("UNRELEASED_REAPPLY"):
|
|
63
|
+
return false
|
|
64
|
+
default:
|
|
65
|
+
panic(fmt.Errorf("unexpected upgrade name %s", validUpgradeName(name)))
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// isFirstTimeUpgradeOfThisVersion looks up in the upgrade store whether no
|
|
70
|
+
// upgrade plan name of this version have previously been applied.
|
|
71
|
+
func isFirstTimeUpgradeOfThisVersion(app *GaiaApp, ctx sdk.Context) bool {
|
|
72
|
+
for _, name := range upgradeNamesOfThisVersion {
|
|
73
|
+
if app.UpgradeKeeper.GetDoneHeight(ctx, name) != 0 {
|
|
74
|
+
return false
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return true
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
func buildProposalStepWithArgs(moduleName string, entrypoint string, opts map[string]any) (vm.CoreProposalStep, error) {
|
|
81
|
+
t := template.Must(template.New("").Parse(`{
|
|
82
|
+
"module": "{{.moduleName}}",
|
|
83
|
+
"entrypoint": "{{.entrypoint}}",
|
|
84
|
+
"args": [ {{.optsArg}} ]
|
|
85
|
+
}`))
|
|
86
|
+
|
|
87
|
+
optsArg, err := json.Marshal(opts)
|
|
88
|
+
if err != nil {
|
|
89
|
+
return nil, err
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
var result strings.Builder
|
|
93
|
+
err = t.Execute(&result, map[string]any{
|
|
94
|
+
"moduleName": moduleName,
|
|
95
|
+
"entrypoint": entrypoint,
|
|
96
|
+
"optsArg": string(optsArg),
|
|
97
|
+
})
|
|
98
|
+
if err != nil {
|
|
99
|
+
return nil, err
|
|
100
|
+
}
|
|
101
|
+
jsonStr := result.String()
|
|
102
|
+
jsonBz := []byte(jsonStr)
|
|
103
|
+
if !json.Valid(jsonBz) {
|
|
104
|
+
return nil, fmt.Errorf("invalid JSON: %s", jsonStr)
|
|
105
|
+
}
|
|
106
|
+
proposal := vm.ArbitraryCoreProposal{Json: jsonBz}
|
|
107
|
+
return vm.CoreProposalStepForModules(proposal), nil
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
func getVariantFromUpgradeName(upgradeName string) string {
|
|
111
|
+
switch upgradeName {
|
|
112
|
+
case "UNRELEASED_A3P_INTEGRATION":
|
|
113
|
+
return "A3P_INTEGRATION"
|
|
114
|
+
case "UNRELEASED_main":
|
|
115
|
+
return "MAINNET"
|
|
116
|
+
case "UNRELEASED_devnet":
|
|
117
|
+
return "DEVNET"
|
|
118
|
+
case "UNRELEASED_emerynet":
|
|
119
|
+
return "EMERYNET"
|
|
120
|
+
// Noupgrade for this version.
|
|
121
|
+
case "UNRELEASED_BASIC":
|
|
122
|
+
return ""
|
|
123
|
+
default:
|
|
124
|
+
return ""
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
func replaceElectorateCoreProposalStep(upgradeName string) (vm.CoreProposalStep, error) {
|
|
129
|
+
variant := getVariantFromUpgradeName(upgradeName)
|
|
130
|
+
|
|
131
|
+
if variant == "" {
|
|
132
|
+
return nil, nil
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return buildProposalStepWithArgs(
|
|
136
|
+
"@agoric/builders/scripts/inter-protocol/replace-electorate-core.js",
|
|
137
|
+
"defaultProposalBuilder",
|
|
138
|
+
map[string]any{
|
|
139
|
+
"variant": variant,
|
|
140
|
+
},
|
|
141
|
+
)
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
func replacePriceFeedsCoreProposal(upgradeName string) (vm.CoreProposalStep, error) {
|
|
145
|
+
variant := getVariantFromUpgradeName(upgradeName)
|
|
146
|
+
|
|
147
|
+
if variant == "" {
|
|
148
|
+
return nil, nil
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return buildProposalStepWithArgs(
|
|
152
|
+
"@agoric/builders/scripts/inter-protocol/updatePriceFeeds.js",
|
|
153
|
+
"defaultProposalBuilder",
|
|
154
|
+
map[string]any{
|
|
155
|
+
"variant": variant,
|
|
156
|
+
},
|
|
157
|
+
)
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// unreleasedUpgradeHandler performs standard upgrade actions plus custom actions for the unreleased upgrade.
|
|
161
|
+
func unreleasedUpgradeHandler(app *GaiaApp, targetUpgrade string) func(sdk.Context, upgradetypes.Plan, module.VersionMap) (module.VersionMap, error) {
|
|
162
|
+
return func(ctx sdk.Context, plan upgradetypes.Plan, fromVm module.VersionMap) (module.VersionMap, error) {
|
|
163
|
+
app.CheckControllerInited(false)
|
|
164
|
+
|
|
165
|
+
CoreProposalSteps := []vm.CoreProposalStep{}
|
|
166
|
+
|
|
167
|
+
// These CoreProposalSteps are not idempotent and should only be executed
|
|
168
|
+
// as part of the first upgrade using this handler on any given chain.
|
|
169
|
+
if isFirstTimeUpgradeOfThisVersion(app, ctx) {
|
|
170
|
+
// The storeUpgrades defined in app.go only execute for the primary upgrade name
|
|
171
|
+
// If we got here and this first upgrade of this version does not use the
|
|
172
|
+
// primary upgrade name, stores have not been initialized correctly.
|
|
173
|
+
if !isPrimaryUpgradeName(plan.Name) {
|
|
174
|
+
return module.VersionMap{}, fmt.Errorf("cannot run %s as first upgrade", plan.Name)
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
replaceElectorateStep, err := replaceElectorateCoreProposalStep(targetUpgrade)
|
|
178
|
+
if err != nil {
|
|
179
|
+
return nil, err
|
|
180
|
+
} else if replaceElectorateStep != nil {
|
|
181
|
+
CoreProposalSteps = append(CoreProposalSteps, replaceElectorateStep)
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
priceFeedUpdate, err := replacePriceFeedsCoreProposal(targetUpgrade)
|
|
185
|
+
if err != nil {
|
|
186
|
+
return nil, err
|
|
187
|
+
} else if priceFeedUpdate != nil {
|
|
188
|
+
CoreProposalSteps = append(CoreProposalSteps,
|
|
189
|
+
priceFeedUpdate,
|
|
190
|
+
// The following have a dependency onto the price feed proposal
|
|
191
|
+
vm.CoreProposalStepForModules(
|
|
192
|
+
"@agoric/builders/scripts/vats/add-auction.js",
|
|
193
|
+
),
|
|
194
|
+
vm.CoreProposalStepForModules(
|
|
195
|
+
"@agoric/builders/scripts/vats/upgradeVaults.js",
|
|
196
|
+
),
|
|
197
|
+
)
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Each CoreProposalStep runs sequentially, and can be constructed from
|
|
201
|
+
// one or more modules executing in parallel within the step.
|
|
202
|
+
CoreProposalSteps = append(CoreProposalSteps,
|
|
203
|
+
vm.CoreProposalStepForModules(
|
|
204
|
+
// Upgrade Zoe (no new ZCF needed).
|
|
205
|
+
"@agoric/builders/scripts/vats/upgrade-zoe.js",
|
|
206
|
+
),
|
|
207
|
+
// Revive KREAd characters
|
|
208
|
+
vm.CoreProposalStepForModules(
|
|
209
|
+
"@agoric/builders/scripts/vats/revive-kread.js",
|
|
210
|
+
),
|
|
211
|
+
vm.CoreProposalStepForModules(
|
|
212
|
+
// Upgrade to include a cleanup from https://github.com/Agoric/agoric-sdk/pull/10319
|
|
213
|
+
"@agoric/builders/scripts/smart-wallet/build-wallet-factory2-upgrade.js",
|
|
214
|
+
),
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
// CoreProposals for Upgrade 19
|
|
218
|
+
CoreProposalSteps = append(CoreProposalSteps,
|
|
219
|
+
vm.CoreProposalStepForModules(
|
|
220
|
+
"@agoric/builders/scripts/inter-protocol/replace-feeDistributor.js",
|
|
221
|
+
),
|
|
222
|
+
)
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
app.upgradeDetails = &upgradeDetails{
|
|
226
|
+
// Record the plan to send to SwingSet
|
|
227
|
+
Plan: plan,
|
|
228
|
+
// Core proposals that should run during the upgrade block
|
|
229
|
+
// These will be merged with any coreProposals specified in the
|
|
230
|
+
// upgradeInfo field of the upgrade plan ran as subsequent steps
|
|
231
|
+
CoreProposals: vm.CoreProposalsFromSteps(CoreProposalSteps...),
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// Always run module migrations
|
|
235
|
+
mvm, err := app.mm.RunMigrations(ctx, app.configurator, fromVm)
|
|
236
|
+
if err != nil {
|
|
237
|
+
return mvm, err
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
m := swingsetkeeper.NewMigrator(app.SwingSetKeeper)
|
|
241
|
+
err = m.MigrateParams(ctx)
|
|
242
|
+
if err != nil {
|
|
243
|
+
return mvm, err
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
return mvm, nil
|
|
247
|
+
}
|
|
248
|
+
}
|
package/cmd/agd/agvm.go
CHANGED
|
@@ -27,9 +27,9 @@ func NewVMCommand(logger log.Logger, binary string, args []string, vmFromAgd, vm
|
|
|
27
27
|
fdToAgd := fdFromAgd + 1
|
|
28
28
|
|
|
29
29
|
// ExtraFiles begins at fd numStdFiles, so we need to compute the array.
|
|
30
|
-
cmd.ExtraFiles = make([]*os.File, fdToAgd
|
|
31
|
-
cmd.ExtraFiles[fdFromAgd
|
|
32
|
-
cmd.ExtraFiles[fdToAgd
|
|
30
|
+
cmd.ExtraFiles = make([]*os.File, fdToAgd-numStdFiles+1)
|
|
31
|
+
cmd.ExtraFiles[fdFromAgd-numStdFiles] = vmFromAgd
|
|
32
|
+
cmd.ExtraFiles[fdToAgd-numStdFiles] = vmToAgd
|
|
33
33
|
|
|
34
34
|
// Pass the file descriptor numbers in the environment.
|
|
35
35
|
cmd.Env = append(
|
package/cmd/agd/find_binary.go
CHANGED
|
@@ -8,7 +8,7 @@ import (
|
|
|
8
8
|
|
|
9
9
|
// FindBinaryNextToMe looks for binName next to the current executable.
|
|
10
10
|
// It returns an absolute filename for binName, or an error.
|
|
11
|
-
func FindBinaryNextToMe(walkUp int, path...
|
|
11
|
+
func FindBinaryNextToMe(walkUp int, path ...string) (string, error) {
|
|
12
12
|
ex, err := os.Executable()
|
|
13
13
|
if err != nil {
|
|
14
14
|
return "", err
|
|
@@ -32,7 +32,7 @@ func FindBinaryNextToMe(walkUp int, path... string) (string, error) {
|
|
|
32
32
|
if _, err = os.Stat(bin); err != nil {
|
|
33
33
|
return "", err
|
|
34
34
|
}
|
|
35
|
-
|
|
35
|
+
|
|
36
36
|
return bin, nil
|
|
37
37
|
}
|
|
38
38
|
|
package/cmd/agd/main.go
CHANGED
|
@@ -49,7 +49,6 @@ func makeShutdown(cmd *exec.Cmd, writer *os.File) func() error {
|
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
|
|
53
52
|
// main is the entry point of the agd daemon. It determines whether to
|
|
54
53
|
// initialize JSON-RPC communications with the separate `--split-vm` VM process,
|
|
55
54
|
// or just to give up control entirely to another binary.
|
|
@@ -58,12 +57,12 @@ func main() {
|
|
|
58
57
|
var shutdown func() error
|
|
59
58
|
|
|
60
59
|
nodePort := 1
|
|
61
|
-
sendToNode
|
|
60
|
+
var sendToNode vm.Sender = func(ctx context.Context, needReply bool, jsonRequest string) (jsonReply string, err error) {
|
|
62
61
|
if vmClient == nil {
|
|
63
62
|
return "", errors.New("sendToVM called without VM client set up")
|
|
64
63
|
}
|
|
65
64
|
|
|
66
|
-
if
|
|
65
|
+
if jsonRequest == "shutdown" {
|
|
67
66
|
// We could ask nicely, but don't bother.
|
|
68
67
|
if shutdown != nil {
|
|
69
68
|
return "", shutdown()
|
|
@@ -72,17 +71,17 @@ func main() {
|
|
|
72
71
|
}
|
|
73
72
|
|
|
74
73
|
msg := vm.Message{
|
|
75
|
-
Port:
|
|
74
|
+
Port: nodePort,
|
|
76
75
|
NeedsReply: needReply,
|
|
77
|
-
Data:
|
|
76
|
+
Data: jsonRequest,
|
|
78
77
|
}
|
|
79
78
|
var reply string
|
|
80
|
-
err
|
|
79
|
+
err = vmClient.Call(vm.ReceiveMessageMethod, msg, &reply)
|
|
81
80
|
return reply, err
|
|
82
81
|
}
|
|
83
82
|
|
|
84
83
|
exitCode := 0
|
|
85
|
-
launchVM := func(logger log.Logger, appOpts servertypes.AppOptions) error {
|
|
84
|
+
launchVM := func(agdServer *vm.AgdServer, logger log.Logger, appOpts servertypes.AppOptions) error {
|
|
86
85
|
args := []string{"ag-chain-cosmos", "--home", gaia.DefaultNodeHome}
|
|
87
86
|
args = append(args, os.Args[1:]...)
|
|
88
87
|
|
|
@@ -129,7 +128,7 @@ func main() {
|
|
|
129
128
|
|
|
130
129
|
// Set up the VM server.
|
|
131
130
|
vmServer := rpc.NewServer()
|
|
132
|
-
if err := vmServer.RegisterName("agd",
|
|
131
|
+
if err := vmServer.RegisterName("agd", agdServer); err != nil {
|
|
133
132
|
return err
|
|
134
133
|
}
|
|
135
134
|
go vmServer.ServeCodec(jsonrpc.NewServerCodec(serverConn))
|
|
@@ -147,11 +146,11 @@ func main() {
|
|
|
147
146
|
}
|
|
148
147
|
|
|
149
148
|
daemoncmd.OnExportHook = launchVM
|
|
150
|
-
daemoncmd.OnStartHook = func
|
|
149
|
+
daemoncmd.OnStartHook = func(agdServer *vm.AgdServer, logger log.Logger, appOpts servertypes.AppOptions) error {
|
|
151
150
|
// We tried running start, which should never exit, so exit with non-zero
|
|
152
151
|
// code if we do.
|
|
153
152
|
exitCode = 99
|
|
154
|
-
return launchVM(logger, appOpts)
|
|
153
|
+
return launchVM(agdServer, logger, appOpts)
|
|
155
154
|
}
|
|
156
155
|
|
|
157
156
|
daemon.RunWithController(sendToNode)
|
package/cmd/libdaemon/main.go
CHANGED
|
@@ -37,22 +37,22 @@ var agdServer *vm.AgdServer
|
|
|
37
37
|
|
|
38
38
|
// ConnectVMClientCodec creates an RPC client codec and a sender to the
|
|
39
39
|
// in-process implementation of the VM.
|
|
40
|
-
func ConnectVMClientCodec(ctx context.Context, nodePort int, sendFunc func(int, int, string)) (*vm.ClientCodec,
|
|
41
|
-
vmClientCodec = vm.NewClientCodec(
|
|
40
|
+
func ConnectVMClientCodec(ctx context.Context, nodePort int, sendFunc func(int, int, string)) (*vm.ClientCodec, vm.Sender) {
|
|
41
|
+
vmClientCodec = vm.NewClientCodec(ctx, sendFunc)
|
|
42
42
|
vmClient := rpc.NewClientWithCodec(vmClientCodec)
|
|
43
43
|
|
|
44
|
-
sendToNode
|
|
45
|
-
if
|
|
44
|
+
var sendToNode vm.Sender = func(ctx context.Context, needReply bool, jsonRequest string) (jsonReply string, err error) {
|
|
45
|
+
if jsonRequest == "shutdown" {
|
|
46
46
|
return "", vmClientCodec.Close()
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
msg := vm.Message{
|
|
50
|
-
Port:
|
|
50
|
+
Port: nodePort,
|
|
51
51
|
NeedsReply: needReply,
|
|
52
|
-
Data:
|
|
52
|
+
Data: jsonRequest,
|
|
53
53
|
}
|
|
54
54
|
var reply string
|
|
55
|
-
err
|
|
55
|
+
err = vmClient.Call(vm.ReceiveMessageMethod, msg, &reply)
|
|
56
56
|
return reply, err
|
|
57
57
|
}
|
|
58
58
|
|
|
@@ -72,7 +72,7 @@ func RunAgCosmosDaemon(nodePort C.int, toNode C.sendFunc, cosmosArgs []*C.char)
|
|
|
72
72
|
panic(err)
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
-
var sendToNode
|
|
75
|
+
var sendToNode vm.Sender
|
|
76
76
|
|
|
77
77
|
sendFunc := func(port int, reply int, str string) {
|
|
78
78
|
C.invokeSendFunc(toNode, C.int(port), C.int(reply), C.CString(str))
|
|
@@ -83,7 +83,6 @@ func RunAgCosmosDaemon(nodePort C.int, toNode C.sendFunc, cosmosArgs []*C.char)
|
|
|
83
83
|
int(nodePort),
|
|
84
84
|
sendFunc,
|
|
85
85
|
)
|
|
86
|
-
agdServer = vm.NewAgdServer()
|
|
87
86
|
|
|
88
87
|
args := make([]string, len(cosmosArgs))
|
|
89
88
|
for i, s := range cosmosArgs {
|
|
@@ -96,7 +95,8 @@ func RunAgCosmosDaemon(nodePort C.int, toNode C.sendFunc, cosmosArgs []*C.char)
|
|
|
96
95
|
// We run in the background, but exit when the job is over.
|
|
97
96
|
// swingset.SendToNode("hello from Initial Go!")
|
|
98
97
|
exitCode := 0
|
|
99
|
-
daemoncmd.OnStartHook = func(logger log.Logger, appOpts servertypes.AppOptions) error {
|
|
98
|
+
daemoncmd.OnStartHook = func(srv *vm.AgdServer, logger log.Logger, appOpts servertypes.AppOptions) error {
|
|
99
|
+
agdServer = srv
|
|
100
100
|
// We tried running start, which should never exit, so exit with non-zero
|
|
101
101
|
// code if we ever stop.
|
|
102
102
|
exitCode = 99
|
|
@@ -130,11 +130,11 @@ func SendToGo(port C.int, msg C.Body) C.Body {
|
|
|
130
130
|
// fmt.Fprintln(os.Stderr, "Send to Go", msgStr)
|
|
131
131
|
var respStr string
|
|
132
132
|
message := &vm.Message{
|
|
133
|
-
Port:
|
|
133
|
+
Port: int(port),
|
|
134
134
|
NeedsReply: true,
|
|
135
|
-
Data:
|
|
135
|
+
Data: msgStr,
|
|
136
136
|
}
|
|
137
|
-
|
|
137
|
+
|
|
138
138
|
err := agdServer.ReceiveMessage(message, &respStr)
|
|
139
139
|
if err == nil {
|
|
140
140
|
return C.CString(respStr)
|