Skip to content

Commit 2022dfc

Browse files
Check that custom dependency version is at least equal to min version defined in latest.json (#2734)
* control default latest version for avago and subnetevm * add rpc to json * get latest cli version * update json model * update evm prompts * update evm prompt * update avalanchego latest * add e2e test * remove unncessary file * lint * try with lower versions * update how we get newest avago version * fix lint * address comments * add min version * fix ci * fix ci * add test for min version * update tests * fix lint * fix lint * lint * move to dependencies pkg * lint * lint * lint * fix merge * address comments * lint --------- Signed-off-by: sukantoraymond <rsukanto@umich.edu>
1 parent fd7a93d commit 2022dfc

File tree

8 files changed

+156
-13
lines changed

8 files changed

+156
-13
lines changed

cmd/blockchaincmd/convert.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,9 @@ func StartLocalMachine(
198198
avagoVersionSettings := dependencies.AvalancheGoVersionSettings{}
199199
// setup (install if needed) avalanchego binary
200200
avagoVersion := userProvidedAvagoVersion
201+
if err = dependencies.CheckVersionIsOverMin(app, constants.AvalancheGoRepoName, network, userProvidedAvagoVersion); err != nil {
202+
return false, err
203+
}
201204
if userProvidedAvagoVersion == constants.DefaultAvalancheGoVersion && avagoBinaryPath == "" {
202205
// nothing given: get avago version from RPC compat using latest.json defined in
203206
// https://raw.githubusercontent.com/ava-labs/avalanche-cli/control-default-version/versions/latest.json

cmd/blockchaincmd/deploy.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -498,9 +498,7 @@ func deployBlockchain(cmd *cobra.Command, args []string) error {
498498

499499
if network.Kind == models.Local {
500500
app.Log.Debug("Deploy local")
501-
502501
avagoVersion := userProvidedAvagoVersion
503-
504502
if avagoVersion == constants.DefaultAvalancheGoVersion && avagoBinaryPath == "" {
505503
avagoVersion, err = dependencies.GetLatestCLISupportedDependencyVersion(app, constants.AvalancheGoRepoName, network, &sidecar.RPCVersion)
506504
if err != nil {

cmd/nodecmd/create.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,13 @@ will apply to all nodes in the cluster`,
135135
// override postrun function from root.go, so that we don't double send metrics for the same command
136136
func handlePostRun(_ *cobra.Command, _ []string) {}
137137

138-
func preCreateChecks(clusterName string) error {
138+
func preCreateChecks(clusterName string, network models.Network) error {
139139
if useCustomAvalanchegoVersion != "" || useAvalanchegoVersionFromSubnet != "" {
140+
if useCustomAvalanchegoVersion != "" {
141+
if err := dependencies.CheckVersionIsOverMin(app, constants.AvalancheGoRepoName, network, useCustomAvalanchegoVersion); err != nil {
142+
return err
143+
}
144+
}
140145
useLatestAvalanchegoReleaseVersion = false
141146
useLatestAvalanchegoPreReleaseVersion = false
142147
}
@@ -305,7 +310,7 @@ func createNodes(cmd *cobra.Command, args []string) error {
305310
"",
306311
)
307312
setGlobalNetworkFlags(network)
308-
if err := preCreateChecks(clusterName); err != nil {
313+
if err := preCreateChecks(clusterName, network); err != nil {
309314
return err
310315
}
311316
network = models.NewNetworkFromCluster(network, clusterName)

cmd/nodecmd/local.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,10 @@ func localStartNode(_ *cobra.Command, args []string) error {
248248
}
249249

250250
if useCustomAvalanchegoVersion != "" {
251+
// TODO: we'll have to refactor all these when we consolidate input and flag handling for dependency versioning
252+
if err = dependencies.CheckVersionIsOverMin(app, constants.AvalancheGoRepoName, network, useCustomAvalanchegoVersion); err != nil {
253+
return err
254+
}
251255
latestAvagoPreReleaseVersion = false
252256
latestAvagoReleaseVersion = false
253257
}

pkg/dependencies/min_version.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// Copyright (C) 2022, Ava Labs, Inc. All rights reserved.
2+
// See the file LICENSE for licensing terms.
3+
package dependencies
4+
5+
import (
6+
"encoding/json"
7+
"fmt"
8+
9+
"golang.org/x/mod/semver"
10+
11+
"github.com/ava-labs/avalanche-cli/pkg/models"
12+
13+
"github.com/ava-labs/avalanche-cli/pkg/application"
14+
"github.com/ava-labs/avalanche-cli/pkg/constants"
15+
)
16+
17+
func CheckVersionIsOverMin(app *application.Avalanche, dependencyName string, network models.Network, version string) error {
18+
dependencyBytes, err := app.Downloader.Download(constants.CLILatestDependencyURL)
19+
if err != nil {
20+
return err
21+
}
22+
23+
var parsedDependency models.CLIDependencyMap
24+
if err = json.Unmarshal(dependencyBytes, &parsedDependency); err != nil {
25+
return err
26+
}
27+
28+
switch dependencyName {
29+
case constants.AvalancheGoRepoName:
30+
// version has to be at least higher than minimum version specified for the dependency
31+
minVersion := parsedDependency.AvalancheGo[network.Name()].MinimumVersion
32+
versionComparison := semver.Compare(version, minVersion)
33+
if versionComparison == -1 {
34+
return fmt.Errorf("minimum version of %s that is supported by CLI is %s, current version provided is %s", dependencyName, minVersion, version)
35+
}
36+
return nil
37+
default:
38+
return fmt.Errorf("minimum version check is unsupported %s dependency", dependencyName)
39+
}
40+
}
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
// Copyright (C) 2022, Ava Labs, Inc. All rights reserved.
2+
// See the file LICENSE for licensing terms.
3+
4+
package dependencies
5+
6+
import (
7+
"testing"
8+
9+
"github.com/ava-labs/avalanche-cli/internal/mocks"
10+
"github.com/ava-labs/avalanche-cli/pkg/application"
11+
"github.com/ava-labs/avalanche-cli/pkg/constants"
12+
"github.com/ava-labs/avalanche-cli/pkg/models"
13+
"github.com/stretchr/testify/mock"
14+
"github.com/stretchr/testify/require"
15+
)
16+
17+
var testCLIMinVersion = []byte(`{"subnet-evm":"v0.7.3","rpc":39,"avalanchego":{"Local Network":{"latest-version":"v1.13.0", "minimum-version":""},"DevNet":{"latest-version":"v1.13.0", "minimum-version":""},"Fuji":{"latest-version":"v1.13.0", "minimum-version":"v1.13.0-fuji"},"Mainnet":{"latest-version":"v1.13.0", "minimum-version":"v1.13.0"}}}`)
18+
19+
func TestCheckMinDependencyVersion(t *testing.T) {
20+
tests := []struct {
21+
name string
22+
dependency string
23+
expectedError bool
24+
cliDependencyData []byte
25+
customVersion string
26+
network models.Network
27+
}{
28+
{
29+
name: "custom avalanchego dependency equal to cli minimum supported version of avalanchego",
30+
dependency: constants.AvalancheGoRepoName,
31+
cliDependencyData: testCLIMinVersion,
32+
expectedError: false,
33+
customVersion: "v1.13.0-fuji",
34+
network: models.NewFujiNetwork(),
35+
},
36+
{
37+
name: "custom avalanchego dependency higher than cli minimum supported version of avalanchego",
38+
dependency: constants.AvalancheGoRepoName,
39+
cliDependencyData: testCLIMinVersion,
40+
expectedError: false,
41+
customVersion: "v1.13.0",
42+
network: models.NewFujiNetwork(),
43+
},
44+
{
45+
name: "custom avalanchego dependency equal to cli minimum supported version of avalanchego",
46+
dependency: constants.AvalancheGoRepoName,
47+
cliDependencyData: testCLIMinVersion,
48+
expectedError: false,
49+
customVersion: "v1.13.0-fuji",
50+
network: models.NewFujiNetwork(),
51+
},
52+
{
53+
name: "custom avalanchego dependency higher than cli minimum supported version of avalanchego",
54+
dependency: constants.AvalancheGoRepoName,
55+
cliDependencyData: testCLIMinVersion,
56+
expectedError: false,
57+
customVersion: "v1.13.1",
58+
network: models.NewFujiNetwork(),
59+
},
60+
{
61+
name: "custom avalanchego dependency lower than cli minimum supported version of avalanchego",
62+
dependency: constants.AvalancheGoRepoName,
63+
cliDependencyData: testCLIMinVersion,
64+
expectedError: true,
65+
customVersion: "v1.12.2",
66+
network: models.NewFujiNetwork(),
67+
},
68+
{
69+
name: "custom avalanchego dependency for network that doesn't have minimum supported version of avalanchego",
70+
dependency: constants.AvalancheGoRepoName,
71+
cliDependencyData: testCLIMinVersion,
72+
expectedError: false,
73+
customVersion: "v1.12.2",
74+
network: models.NewLocalNetwork(),
75+
},
76+
}
77+
78+
for _, tt := range tests {
79+
mockDownloader := &mocks.Downloader{}
80+
mockDownloader.On("Download", mock.MatchedBy(func(url string) bool {
81+
return url == constants.CLILatestDependencyURL
82+
})).Return(tt.cliDependencyData, nil)
83+
84+
app := application.New()
85+
app.Downloader = mockDownloader
86+
87+
t.Run(tt.name, func(t *testing.T) {
88+
err := CheckVersionIsOverMin(app, tt.dependency, tt.network, tt.customVersion)
89+
if tt.expectedError {
90+
require.Error(t, err)
91+
} else {
92+
require.NoError(t, err)
93+
}
94+
})
95+
}
96+
}

pkg/models/compatibility.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ type VMCompatibility struct {
1010
type AvagoCompatiblity map[string][]string
1111

1212
type NetworkVersion struct {
13-
LatestVersion string `json:"latest-version"`
13+
LatestVersion string `json:"latest-version"`
14+
MinimumVersion string `json:"minimum-version"`
1415
}
1516

1617
type CLIDependencyMap struct {

versions/latest.json

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,19 @@
44
"avalanchego": {
55
"Local Network": {
66
"latest-version": "v1.13.0",
7-
"require-prerelease": false,
8-
"prerelease-version": ""
7+
"minimum-version": ""
98
},
109
"DevNet": {
1110
"latest-version": "v1.13.0",
12-
"require-prerelease": false,
13-
"prerelease-version": ""
11+
"minimum-version": ""
1412
},
1513
"Fuji": {
1614
"latest-version": "v1.13.0",
17-
"require-prerelease": false,
18-
"prerelease-version": ""
15+
"minimum-version": "v1.13.0-fuji"
1916
},
2017
"Mainnet": {
2118
"latest-version": "v1.13.0",
22-
"require-prerelease": false,
23-
"prerelease-version": ""
19+
"minimum-version": "v1.13.0"
2420
}
2521
}
2622
}

0 commit comments

Comments
 (0)