From 6cb0418b91c0b8b639ce1212eaf34b01759de10a Mon Sep 17 00:00:00 2001 From: Eslam-Nawara Date: Sun, 9 Mar 2025 17:40:29 +0200 Subject: [PATCH 01/17] support create/update farm with stellar address --- .goreleaser.yaml | 21 ++--- go.work | 6 +- go.work.sum | 17 ++++ node-registrar/client/farm.go | 3 + registrar-cli/LICENSE | 0 registrar-cli/Makefile | 36 ++++++++ registrar-cli/README.md | 43 +++++++++ registrar-cli/cmd/create.go | 16 ++++ registrar-cli/cmd/create_account.go | 117 ++++++++++++++++++++++++ registrar-cli/cmd/create_farm.go | 74 +++++++++++++++ registrar-cli/cmd/get.go | 16 ++++ registrar-cli/cmd/get_account.go | 84 +++++++++++++++++ registrar-cli/cmd/get_farm.go | 67 ++++++++++++++ registrar-cli/cmd/get_node.go | 79 ++++++++++++++++ registrar-cli/cmd/get_zos_version.go | 56 ++++++++++++ registrar-cli/cmd/root.go | 39 ++++++++ registrar-cli/cmd/update.go | 16 ++++ registrar-cli/cmd/update_account.go | 82 +++++++++++++++++ registrar-cli/cmd/update_farm.go | 88 ++++++++++++++++++ registrar-cli/cmd/update_zos_version.go | 73 +++++++++++++++ registrar-cli/cmd/version.go | 28 ++++++ registrar-cli/go.mod | 18 ++++ registrar-cli/go.sum | 37 ++++++++ registrar-cli/main.go | 10 ++ 24 files changed, 1009 insertions(+), 17 deletions(-) create mode 100644 registrar-cli/LICENSE create mode 100644 registrar-cli/Makefile create mode 100644 registrar-cli/README.md create mode 100644 registrar-cli/cmd/create.go create mode 100644 registrar-cli/cmd/create_account.go create mode 100644 registrar-cli/cmd/create_farm.go create mode 100644 registrar-cli/cmd/get.go create mode 100644 registrar-cli/cmd/get_account.go create mode 100644 registrar-cli/cmd/get_farm.go create mode 100644 registrar-cli/cmd/get_node.go create mode 100644 registrar-cli/cmd/get_zos_version.go create mode 100644 registrar-cli/cmd/root.go create mode 100644 registrar-cli/cmd/update.go create mode 100644 registrar-cli/cmd/update_account.go create mode 100644 registrar-cli/cmd/update_farm.go create mode 100644 registrar-cli/cmd/update_zos_version.go create mode 100644 registrar-cli/cmd/version.go create mode 100644 registrar-cli/go.mod create mode 100644 registrar-cli/go.sum create mode 100644 registrar-cli/main.go diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 039a915..318c9ce 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -18,31 +18,22 @@ builds: - -X github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/cmd.version={{.Tag}} - -X github.com/threefoldtech/tfgrid-sdk-go/node-registrar/cmd.commit={{.Commit}} - - dir: ./node-registrar/tools/account + - dir: ./node-registrar/tools/registrar-cli env: - CGO_ENABLED=0 goos: - linux - windows - darwin - binary: new-account - id: new-account + binary: reg-cli + id: reg-cli ignore: - goos: windows + ldflags: + - -X github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/cmd.version={{.Tag}} + - -X github.com/threefoldtech/tfgrid-sdk-go/node-registrar/cmd.commit={{.Commit}} - - dir: ./node-registrar/tools/farm - env: - - CGO_ENABLED=0 - goos: - - linux - - windows - - darwin - binary: new-farm - id: new-farm - - ignore: - - goos: windows archives: diff --git a/go.work b/go.work index 179b9fc..36366c9 100644 --- a/go.work +++ b/go.work @@ -1,4 +1,6 @@ go 1.23.0 -use ./node-registrar -use ./rmb-sdk-go +use ( + ./node-registrar + ./registrar-cli +) diff --git a/go.work.sum b/go.work.sum index 59865b4..8f864d2 100644 --- a/go.work.sum +++ b/go.work.sum @@ -106,19 +106,31 @@ golang.org/x/exp v0.0.0-20230206171751-46f607a40771/go.mod h1:CxIveKay+FTh1D0yPZ golang.org/x/image v0.25.0/go.mod h1:tCAmOEGthTtkalusGp1g3xa2gke8J6c2N565dTyl9Rs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= +golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= @@ -126,15 +138,20 @@ golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= +golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ= golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= diff --git a/node-registrar/client/farm.go b/node-registrar/client/farm.go index 88fc1a8..398c5b4 100644 --- a/node-registrar/client/farm.go +++ b/node-registrar/client/farm.go @@ -286,6 +286,9 @@ func parseUpdateFarmOpts(update FarmUpdate) map[string]any { if update.StellarAddress != nil { data["stellar_address"] = *update.StellarAddress } + if len(cfg.stellarAddress) != 0 { + data["stellar_address"] = cfg.stellarAddress + } if update.Dedicated != nil { data["dedicated"] = *update.Dedicated diff --git a/registrar-cli/LICENSE b/registrar-cli/LICENSE new file mode 100644 index 0000000..e69de29 diff --git a/registrar-cli/Makefile b/registrar-cli/Makefile new file mode 100644 index 0000000..a5bdaaf --- /dev/null +++ b/registrar-cli/Makefile @@ -0,0 +1,36 @@ +PWD := $(shell pwd) +GOPATH := $(shell go env GOPATH) + +all: verifiers test + +test: + @echo "Running Tests" + go test -v ./... + +coverage: clean + @echo "Installing gopherbadger" && go get -u github.com/jpoles1/gopherbadger && go install github.com/jpoles1/gopherbadger + mkdir coverage + go test -v -vet=off ./... -coverprofile=coverage/coverage.out + go tool cover -html=coverage/coverage.out -o coverage/coverage.html + @${GOPATH}/bin/gopherbadger -png=false -md="README.md" + rm coverage.out + go mod tidy + +clean: + rm ./coverage -rf + rm ./bin -rf + +getverifiers: + @echo "Installing golangci-lint" && go install github.com/golangci/golangci-lint/cmd/golangci-lint + go mod tidy + +lint: + @echo "Running $@" + golangci-lint run -c ../.golangci.yml + +build: + @echo "Running $@" + @go build -ldflags=\ + "-X 'github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/tools/registrar-cli/cmd.commit=$(shell git rev-parse HEAD)'\ + -X 'github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/tools/registrar-cli/cmd.version=$(shell git tag --sort=-version:refname | head -n 1)'"\ + -o bin/registrar-cli main.go diff --git a/registrar-cli/README.md b/registrar-cli/README.md new file mode 100644 index 0000000..9c15678 --- /dev/null +++ b/registrar-cli/README.md @@ -0,0 +1,43 @@ +# New Farm Tool + +## Overview + +This tool allows users to create/get/update farm/account/node on a specified network. + +## Installation + +1. Clone the repository: + + ```sh + git clone https://github.com/threefoldtech/tfgrid4-sdk-go + ``` + +2. Navigate to the project directory: + + ```sh + cd node-registrar/tools/registrar-cli + ``` + +3. Build the application: + + ```sh + go build -o registrar-cli main.go + ``` + +## Usage + +```sh +./registrar-cli -seed -network -farm_name +``` + +### Parameters + +- `-seed` (required): A hexadecimal string used as a private key seed. +- `-network` (required): Specifies the network (`dev`, `qa`, `test`, `main`). +- `-farm_name` (required): The name of the farm to create. + +### Example Usage + +```sh +./registrar-cli -seed aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899 -network dev -farm_name MyFarm +``` diff --git a/registrar-cli/cmd/create.go b/registrar-cli/cmd/create.go new file mode 100644 index 0000000..9af0819 --- /dev/null +++ b/registrar-cli/cmd/create.go @@ -0,0 +1,16 @@ +// Package cmd for parsing command line arguments +package cmd + +import ( + "github.com/spf13/cobra" +) + +// createCmd represents the create command +var createCmd = &cobra.Command{ + Use: "create", + Short: "create account/farm on Threefold grid4", +} + +func init() { + rootCmd.AddCommand(createCmd) +} diff --git a/registrar-cli/cmd/create_account.go b/registrar-cli/cmd/create_account.go new file mode 100644 index 0000000..67e56f3 --- /dev/null +++ b/registrar-cli/cmd/create_account.go @@ -0,0 +1,117 @@ +// Package cmd for parsing command line arguments +package cmd + +import ( + "crypto/ed25519" + "crypto/rand" + "encoding/hex" + "fmt" + + "github.com/rs/zerolog/log" + "github.com/spf13/cobra" + "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" +) + +// createAccountCmd represents the cancel command +var createAccountCmd = &cobra.Command{ + Use: "account", + Short: "create new account in node registrar", + RunE: func(cmd *cobra.Command, args []string) error { + seed, err := cmd.Flags().GetString("seed") + if err != nil { + return err + } + + network, err := cmd.Flags().GetString("network") + if err != nil { + return err + } + + relays, err := cmd.Flags().GetStringArray("relays") + if err != nil { + return err + } + + rmbEncKey, err := cmd.Flags().GetString("rmb-enc-key") + if err != nil { + return err + } + + u, ok := urls[network] + if !ok { + return fmt.Errorf("invalid network %s", network) + } + + if len(seed) == 0 { + seed, err = generateRandomSeed() + if err != nil { + return err + } + log.Info().Msgf("New Seed (Hex): %s", seed) + } + + seedBytes, err := hex.DecodeString(seed) + if err != nil { + return err + } + + privateKey := ed25519.NewKeyFromSeed(seedBytes) + publicKey := privateKey.Public().(ed25519.PublicKey) + + log.Info().Msgf("public key (Hex): %s", hex.EncodeToString(publicKey)) + + cli, err := client.NewRegistrarClient(u, seedBytes) + if err != nil { + return err + } + + account, err := cli.CreateAccount(relays, rmbEncKey) + if err != nil { + return err + } + + log.Info().Uint64("twinID", account.TwinID).Msg("account is created successfully") + + return nil + }, +} + +func init() { + createCmd.AddCommand(createAccountCmd) + createAccountCmd.Flags().StringP("seed", "s", "", "account seed key") + createAccountCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") + createAccountCmd.Flags().StringArrayP("relays", "r", nil, "relays urls") + createAccountCmd.Flags().StringP("rmb-enc-key", "k", "", "rmb encryption key") +} + +func generateRandomSeed() (string, error) { + s := make([]byte, 32) + _, err := rand.Read(s) + if err != nil { + return "", err + } + + seed := hex.EncodeToString(s) + return seed, nil +} + +func createAccount(c client.RegistrarClient, relays []string, rmbEncKey string) (client.Account, error) { + account, err := c.CreateAccount(relays, rmbEncKey) + if err != nil { + log.Fatal().Err(err).Msg("failed to create new account on registrar") + } + + return account, err +} + +func parseSeed(seed string) (ed25519.PublicKey, ed25519.PrivateKey, []byte, error) { + privateKeyBytes, err := hex.DecodeString(seed) + if err != nil { + return nil, nil, nil, err + } + + privateKey := ed25519.NewKeyFromSeed(privateKeyBytes) + publicKey := privateKey.Public().(ed25519.PublicKey) + + return publicKey, privateKey, privateKeyBytes, nil +} diff --git a/registrar-cli/cmd/create_farm.go b/registrar-cli/cmd/create_farm.go new file mode 100644 index 0000000..466bf92 --- /dev/null +++ b/registrar-cli/cmd/create_farm.go @@ -0,0 +1,74 @@ +// Package cmd for parsing command line arguments +package cmd + +import ( + "encoding/hex" + "fmt" + + "github.com/rs/zerolog/log" + "github.com/spf13/cobra" + "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" +) + +// createFarmCmd represents the cancel command +var createFarmCmd = &cobra.Command{ + Use: "farm", + Short: "create new farm in node registrar", + RunE: func(cmd *cobra.Command, args []string) error { + seed, err := cmd.Flags().GetString("seed") + if err != nil { + return err + } + + network, err := cmd.Flags().GetString("network") + if err != nil { + return err + } + + farmName, err := cmd.Flags().GetString("farm-name") + if err != nil { + return err + } + + dedicated, err := cmd.Flags().GetBool("dedicated") + if err != nil { + return err + } + + u, ok := urls[network] + if !ok { + return fmt.Errorf("invalid network %s", network) + } + + if len(seed) == 0 { + return fmt.Errorf("can not initialize registrar client with no seed") + } + + seedBytes, err := hex.DecodeString(seed) + if err != nil { + return err + } + + cli, err := client.NewRegistrarClient(u, seedBytes) + if err != nil { + return err + } + + farm, err := cli.CreateFarm(farmName, dedicated) + if err != nil { + return err + } + + log.Info().Uint64("farmID", farm).Msg("farm is created successfully") + + return nil + }, +} + +func init() { + createCmd.AddCommand(createFarmCmd) + createFarmCmd.Flags().StringP("seed", "s", "", "account seed key") + createFarmCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") + createFarmCmd.Flags().StringP("farm-name", "f", "", "farm name") + createFarmCmd.Flags().BoolP("dedicated", "d", false, "is farm dedicated") +} diff --git a/registrar-cli/cmd/get.go b/registrar-cli/cmd/get.go new file mode 100644 index 0000000..20c04db --- /dev/null +++ b/registrar-cli/cmd/get.go @@ -0,0 +1,16 @@ +// Package cmd for parsing command line arguments +package cmd + +import ( + "github.com/spf13/cobra" +) + +// getCmd represents the get command +var getCmd = &cobra.Command{ + Use: "get", + Short: "get account/farm/node from Threefold grid4", +} + +func init() { + rootCmd.AddCommand(getCmd) +} diff --git a/registrar-cli/cmd/get_account.go b/registrar-cli/cmd/get_account.go new file mode 100644 index 0000000..46e3c74 --- /dev/null +++ b/registrar-cli/cmd/get_account.go @@ -0,0 +1,84 @@ +// Package cmd for parsing command line arguments +package cmd + +import ( + "encoding/hex" + "fmt" + + "github.com/rs/zerolog/log" + "github.com/spf13/cobra" + "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" +) + +// getAccountCmd represents the cancel command +var getAccountCmd = &cobra.Command{ + Use: "account", + Short: "get account from node registrar", + RunE: func(cmd *cobra.Command, args []string) error { + network, err := cmd.Flags().GetString("network") + if err != nil { + return err + } + + twinID, err := cmd.Flags().GetUint64("twin-id") + if err != nil { + return err + } + + pk, err := cmd.Flags().GetString("public-key") + if err != nil { + return err + } + + u, ok := urls[network] + if !ok { + return fmt.Errorf("invalid network %s", network) + } + + seed, err := generateRandomSeed() + if err != nil { + return err + } + + seedBytes, err := hex.DecodeString(seed) + if err != nil { + return err + } + + publicKey, err := hex.DecodeString(pk) + if err != nil { + return err + } + + cli, err := client.NewRegistrarClient(u, seedBytes) + if err != nil { + return err + } + + if twinID != 0 { + account, err := cli.GetAccount(twinID) + if err != nil { + return err + } + log.Info().Any("account", account).Send() + + } else if len(publicKey) != 0 { + account, err := cli.GetAccountByPK(publicKey) + if err != nil { + return err + } + log.Info().Any("account", account).Send() + } else { + return fmt.Errorf("you need to provide either twin id or public key to load an account") + } + + return nil + }, +} + +func init() { + getCmd.AddCommand(getAccountCmd) + getAccountCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") + getAccountCmd.Flags().Uint64P("twin-id", "i", 0, "twin id") + getAccountCmd.Flags().StringP("public-key", "k", "", "account public key") +} diff --git a/registrar-cli/cmd/get_farm.go b/registrar-cli/cmd/get_farm.go new file mode 100644 index 0000000..f6b8078 --- /dev/null +++ b/registrar-cli/cmd/get_farm.go @@ -0,0 +1,67 @@ +// Package cmd for parsing command line arguments +package cmd + +import ( + "encoding/hex" + "fmt" + + "github.com/rs/zerolog/log" + "github.com/spf13/cobra" + "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" +) + +// getFarmCmd represents the cancel command +var getFarmCmd = &cobra.Command{ + Use: "farm", + Short: "get farm from node registrar", + RunE: func(cmd *cobra.Command, args []string) error { + network, err := cmd.Flags().GetString("network") + if err != nil { + return err + } + + farmID, err := cmd.Flags().GetUint64("farm-id") + if err != nil { + return err + } + + u, ok := urls[network] + if !ok { + return fmt.Errorf("invalid network %s", network) + } + + seed, err := generateRandomSeed() + if err != nil { + return err + } + + seedBytes, err := hex.DecodeString(seed) + if err != nil { + return err + } + + cli, err := client.NewRegistrarClient(u, seedBytes) + if err != nil { + return err + } + + if farmID != 0 { + farm, err := cli.GetFarm(farmID) + if err != nil { + return err + } + log.Info().Any("farm", farm).Send() + + } else { + return fmt.Errorf("you need to provide either farm id to load a farm") + } + + return nil + }, +} + +func init() { + getCmd.AddCommand(getFarmCmd) + getFarmCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") + getFarmCmd.Flags().Uint64P("farm-id", "i", 0, "farm id") +} diff --git a/registrar-cli/cmd/get_node.go b/registrar-cli/cmd/get_node.go new file mode 100644 index 0000000..b292ad4 --- /dev/null +++ b/registrar-cli/cmd/get_node.go @@ -0,0 +1,79 @@ +// Package cmd for parsing command line arguments +package cmd + +import ( + "encoding/hex" + "fmt" + + "github.com/rs/zerolog/log" + "github.com/spf13/cobra" + "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" +) + +// getNodeCmd represents the cancel command +var getNodeCmd = &cobra.Command{ + Use: "node", + Short: "get node from node registrar", + RunE: func(cmd *cobra.Command, args []string) error { + network, err := cmd.Flags().GetString("network") + if err != nil { + return err + } + + nodeID, err := cmd.Flags().GetUint64("node-id") + if err != nil { + return err + } + + twinID, err := cmd.Flags().GetUint64("twin-id") + if err != nil { + return err + } + + u, ok := urls[network] + if !ok { + return fmt.Errorf("invalid network %s", network) + } + + seed, err := generateRandomSeed() + if err != nil { + return err + } + + seedBytes, err := hex.DecodeString(seed) + if err != nil { + return err + } + + cli, err := client.NewRegistrarClient(u, seedBytes) + if err != nil { + return err + } + + if nodeID != 0 { + node, err := cli.GetNode(nodeID) + if err != nil { + return err + } + log.Info().Any("node", node).Send() + + } else if twinID != 0 { + node, err := cli.GetNodeByTwinID(twinID) + if err != nil { + return err + } + log.Info().Any("node", node).Send() + } else { + return fmt.Errorf("you need to provide either twin id or node id to load a node") + } + + return nil + }, +} + +func init() { + getCmd.AddCommand(getNodeCmd) + getNodeCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") + getNodeCmd.Flags().Uint64("node-id", 0, "node id") + getNodeCmd.Flags().Uint64("twin-id", 0, "twin id") +} diff --git a/registrar-cli/cmd/get_zos_version.go b/registrar-cli/cmd/get_zos_version.go new file mode 100644 index 0000000..e1d98ab --- /dev/null +++ b/registrar-cli/cmd/get_zos_version.go @@ -0,0 +1,56 @@ +// Package cmd for parsing command line arguments +package cmd + +import ( + "encoding/hex" + "fmt" + + "github.com/rs/zerolog/log" + "github.com/spf13/cobra" + "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" +) + +// getZosVersionCmd represents the zos version command +var getZosVersionCmd = &cobra.Command{ + Use: "version", + Short: "get zos version from Threefold grid4", + RunE: func(cmd *cobra.Command, args []string) error { + network, err := cmd.Flags().GetString("network") + if err != nil { + return err + } + + u, ok := urls[network] + if !ok { + return fmt.Errorf("invalid network %s", network) + } + + seed, err := generateRandomSeed() + if err != nil { + return err + } + + seedBytes, err := hex.DecodeString(seed) + if err != nil { + return err + } + + cli, err := client.NewRegistrarClient(u, seedBytes) + if err != nil { + return err + } + + version, err := cli.GetZosVersion() + if err != nil { + return err + } + log.Info().Any("zosVersion", version).Send() + + return nil + }, +} + +func init() { + getCmd.AddCommand(getZosVersionCmd) + getZosVersionCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") +} diff --git a/registrar-cli/cmd/root.go b/registrar-cli/cmd/root.go new file mode 100644 index 0000000..233bf1e --- /dev/null +++ b/registrar-cli/cmd/root.go @@ -0,0 +1,39 @@ +/* +Copyright © 2025 NAME HERE +*/ +package cmd + +import ( + "os" + + "github.com/rs/zerolog" + "github.com/rs/zerolog/log" + "github.com/spf13/cobra" +) + +var urls = map[string]string{ + "dev": "https://registrar.dev4.grid.tf/v1", + "qa": "https://registrar.qa4.grid.tf/v1", + "test": "https://registrar.test4.grid.tf/v1", + "main": "https://registrar.prod4.grid.tf/v1", +} + +// rootCmd represents the base command when called without any subcommands +var rootCmd = &cobra.Command{ + Use: "registrar-cli", + Short: "cli tool to be used to interact with node registrar", +} + +// Execute adds all child commands to the root command and sets flags appropriately. +// This is called by main.main(). It only needs to happen once to the rootCmd. +func Execute() { + err := rootCmd.Execute() + if err != nil { + log.Fatal().Err(err).Send() + } +} + +func init() { + zerolog.SetGlobalLevel(zerolog.InfoLevel) + log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr}) +} diff --git a/registrar-cli/cmd/update.go b/registrar-cli/cmd/update.go new file mode 100644 index 0000000..4febe43 --- /dev/null +++ b/registrar-cli/cmd/update.go @@ -0,0 +1,16 @@ +// Package cmd for parsing command line arguments +package cmd + +import ( + "github.com/spf13/cobra" +) + +// updateCmd represents the update command +var updateCmd = &cobra.Command{ + Use: "update", + Short: "update account/farm/node on Threefold grid4", +} + +func init() { + rootCmd.AddCommand(updateCmd) +} diff --git a/registrar-cli/cmd/update_account.go b/registrar-cli/cmd/update_account.go new file mode 100644 index 0000000..a7373e2 --- /dev/null +++ b/registrar-cli/cmd/update_account.go @@ -0,0 +1,82 @@ +// Package cmd for parsing command line arguments +package cmd + +import ( + "encoding/hex" + "fmt" + + "github.com/rs/zerolog/log" + "github.com/spf13/cobra" + "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" +) + +// UpdateAccountCmd represents the cancel command +var UpdateAccountCmd = &cobra.Command{ + Use: "account", + Short: "update account in node registrar", + RunE: func(cmd *cobra.Command, args []string) error { + seed, err := cmd.Flags().GetString("seed") + if err != nil { + return err + } + + network, err := cmd.Flags().GetString("network") + if err != nil { + return err + } + + relays, err := cmd.Flags().GetStringArray("relays") + if err != nil { + return err + } + + rmbEncKey, err := cmd.Flags().GetString("rmb-enc-key") + if err != nil { + return err + } + + u, ok := urls[network] + if !ok { + return fmt.Errorf("invalid network %s", network) + } + + if len(seed) == 0 { + return fmt.Errorf("can not initialize registrar client with no seed") + } + + seedBytes, err := hex.DecodeString(seed) + if err != nil { + return err + } + + cli, err := client.NewRegistrarClient(u, seedBytes) + if err != nil { + return err + } + + var opts []client.UpdateAccountOpts + if len(relays) > 0 { + opts = append(opts, client.UpdateAccountWithRelays(relays)) + } + + if len(rmbEncKey) > 0 { + opts = append(opts, client.UpdateAccountWithRMBEncKey(rmbEncKey)) + } + + err = cli.UpdateAccount(opts...) + if err != nil { + return err + } + log.Info().Msg("account is updated successfully") + + return nil + }, +} + +func init() { + updateCmd.AddCommand(UpdateAccountCmd) + UpdateAccountCmd.Flags().StringP("seed", "s", "", "account seed key") + UpdateAccountCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") + UpdateAccountCmd.Flags().StringArrayP("relays", "r", nil, "relays urls") + UpdateAccountCmd.Flags().StringP("rmb-enc-key", "k", "", "rmb encryption key") +} diff --git a/registrar-cli/cmd/update_farm.go b/registrar-cli/cmd/update_farm.go new file mode 100644 index 0000000..215a0b2 --- /dev/null +++ b/registrar-cli/cmd/update_farm.go @@ -0,0 +1,88 @@ +// Package cmd for parsing command line arguments +package cmd + +import ( + "encoding/hex" + "fmt" + + "github.com/rs/zerolog/log" + "github.com/spf13/cobra" + "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" +) + +// UpdateFarmCmd represents the update farm command +var UpdateFarmCmd = &cobra.Command{ + Use: "farm", + Short: "update farm in node registrar", + RunE: func(cmd *cobra.Command, args []string) error { + seed, err := cmd.Flags().GetString("seed") + if err != nil { + return err + } + + network, err := cmd.Flags().GetString("network") + if err != nil { + return err + } + + farmID, err := cmd.Flags().GetUint64("farm-id") + if err != nil { + return err + } + + farmName, err := cmd.Flags().GetString("farm-name") + if err != nil { + return err + } + + dedicated, err := cmd.Flags().GetBool("dedicated") + if err != nil { + return err + } + + u, ok := urls[network] + if !ok { + return fmt.Errorf("invalid network %s", network) + } + + if len(seed) == 0 { + return fmt.Errorf("can not initialize registrar client with no seed") + } + + seedBytes, err := hex.DecodeString(seed) + if err != nil { + return err + } + + cli, err := client.NewRegistrarClient(u, seedBytes) + if err != nil { + return err + } + + var opts []client.UpdateFarmOpts + if len(farmName) > 0 { + opts = append(opts, client.UpdateFarmWithName(farmName)) + } + + if dedicated { + opts = append(opts, client.UpdateFarmWithDedicated()) + } + + err = cli.UpdateFarm(farmID, opts...) + if err != nil { + return err + } + log.Info().Msg("farm is updated successfully") + + return nil + }, +} + +func init() { + updateCmd.AddCommand(UpdateFarmCmd) + UpdateFarmCmd.Flags().StringP("seed", "s", "", "account seed key") + UpdateFarmCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") + UpdateFarmCmd.Flags().Uint64P("farm-id", "i", 0, "farm id") + UpdateFarmCmd.Flags().String("farm-name", "", "new farm name") + UpdateFarmCmd.Flags().BoolP("dedicated", "d", false, "farm is dedicated") +} diff --git a/registrar-cli/cmd/update_zos_version.go b/registrar-cli/cmd/update_zos_version.go new file mode 100644 index 0000000..9c36d9e --- /dev/null +++ b/registrar-cli/cmd/update_zos_version.go @@ -0,0 +1,73 @@ +// Package cmd for parsing command line arguments +package cmd + +import ( + "encoding/hex" + "fmt" + + "github.com/rs/zerolog/log" + "github.com/spf13/cobra" + "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" +) + +// UpdateZosVersionCmd represents the update farm command +var UpdateZosVersionCmd = &cobra.Command{ + Use: "version", + Short: "update zos version in node registrar", + RunE: func(cmd *cobra.Command, args []string) error { + seed, err := cmd.Flags().GetString("seed") + if err != nil { + return err + } + + network, err := cmd.Flags().GetString("network") + if err != nil { + return err + } + + version, err := cmd.Flags().GetString("version") + if err != nil { + return err + } + + safeToUpgrade, err := cmd.Flags().GetBool("safe-to-upgrade") + if err != nil { + return err + } + + u, ok := urls[network] + if !ok { + return fmt.Errorf("invalid network %s", network) + } + + if len(seed) == 0 { + return fmt.Errorf("can not initialize registrar client with no seed") + } + + seedBytes, err := hex.DecodeString(seed) + if err != nil { + return err + } + + cli, err := client.NewRegistrarClient(u, seedBytes) + if err != nil { + return err + } + + err = cli.SetZosVersion(version, safeToUpgrade) + if err != nil { + return err + } + log.Info().Msg("farm is updated successfully") + + return nil + }, +} + +func init() { + updateCmd.AddCommand(UpdateZosVersionCmd) + UpdateZosVersionCmd.Flags().StringP("seed", "s", "", "account seed key") + UpdateZosVersionCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") + UpdateZosVersionCmd.Flags().StringP("version", "v", "v0.0.0", "new zos version") + UpdateZosVersionCmd.Flags().BoolP("safe-to-upgrade", "u", false, "safe to upgrade") +} diff --git a/registrar-cli/cmd/version.go b/registrar-cli/cmd/version.go new file mode 100644 index 0000000..0077662 --- /dev/null +++ b/registrar-cli/cmd/version.go @@ -0,0 +1,28 @@ +// Package cmd for parsing command line arguments +package cmd + +import ( + "fmt" + + "github.com/spf13/cobra" +) + +// set at build time +var ( + commit string + version string +) + +// versionCmd represents the version command +var versionCmd = &cobra.Command{ + Use: "version", + Short: "Get latest build tag", + Run: func(cmd *cobra.Command, args []string) { + fmt.Println(version) + fmt.Println(commit) + }, +} + +func init() { + rootCmd.AddCommand(versionCmd) +} diff --git a/registrar-cli/go.mod b/registrar-cli/go.mod new file mode 100644 index 0000000..f6a0362 --- /dev/null +++ b/registrar-cli/go.mod @@ -0,0 +1,18 @@ +module github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli + +go 1.21.0 + +require ( + github.com/rs/zerolog v1.33.0 + github.com/spf13/cobra v1.9.1 + github.com/threefoldtech/tfgrid4-sdk-go/node-registrar v0.0.0-20250226140024-dc119126c93f +) + +require ( + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/spf13/pflag v1.0.6 // indirect + golang.org/x/sys v0.28.0 // indirect +) diff --git a/registrar-cli/go.sum b/registrar-cli/go.sum new file mode 100644 index 0000000..01ae64d --- /dev/null +++ b/registrar-cli/go.sum @@ -0,0 +1,37 @@ +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= +github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= +github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/threefoldtech/tfgrid4-sdk-go/node-registrar v0.0.0-20250226140024-dc119126c93f h1:IJ0BULHQuYWT6UFFiZEhEB0QyFSSbyCPgcKaAVII4a4= +github.com/threefoldtech/tfgrid4-sdk-go/node-registrar v0.0.0-20250226140024-dc119126c93f/go.mod h1:x6Sluj6YKfelWzcNwsD2oqGO8dpRlH7fbmeIqEsK8hI= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/registrar-cli/main.go b/registrar-cli/main.go new file mode 100644 index 0000000..0fea299 --- /dev/null +++ b/registrar-cli/main.go @@ -0,0 +1,10 @@ +/* +Copyright © 2025 NAME HERE +*/ +package main + +import "github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli/cmd" + +func main() { + cmd.Execute() +} From e9da4a483b92694eb11e320ecac92042079f38af Mon Sep 17 00:00:00 2001 From: Eslam-Nawara Date: Wed, 26 Feb 2025 21:50:19 +0200 Subject: [PATCH 02/17] use private key instead of seed in registrar client --- registrar-cli/cmd/create_account.go | 23 +---------------------- registrar-cli/cmd/create_farm.go | 4 +++- registrar-cli/cmd/get_account.go | 4 +++- registrar-cli/cmd/get_node.go | 4 +++- registrar-cli/cmd/get_zos_version.go | 4 +++- registrar-cli/cmd/update_account.go | 4 +++- registrar-cli/cmd/update_farm.go | 4 +++- registrar-cli/go.mod | 2 +- registrar-cli/go.sum | 2 ++ 9 files changed, 22 insertions(+), 29 deletions(-) diff --git a/registrar-cli/cmd/create_account.go b/registrar-cli/cmd/create_account.go index 67e56f3..955589e 100644 --- a/registrar-cli/cmd/create_account.go +++ b/registrar-cli/cmd/create_account.go @@ -60,7 +60,7 @@ var createAccountCmd = &cobra.Command{ log.Info().Msgf("public key (Hex): %s", hex.EncodeToString(publicKey)) - cli, err := client.NewRegistrarClient(u, seedBytes) + cli, err := client.NewRegistrarClient(u, privateKey) if err != nil { return err } @@ -94,24 +94,3 @@ func generateRandomSeed() (string, error) { seed := hex.EncodeToString(s) return seed, nil } - -func createAccount(c client.RegistrarClient, relays []string, rmbEncKey string) (client.Account, error) { - account, err := c.CreateAccount(relays, rmbEncKey) - if err != nil { - log.Fatal().Err(err).Msg("failed to create new account on registrar") - } - - return account, err -} - -func parseSeed(seed string) (ed25519.PublicKey, ed25519.PrivateKey, []byte, error) { - privateKeyBytes, err := hex.DecodeString(seed) - if err != nil { - return nil, nil, nil, err - } - - privateKey := ed25519.NewKeyFromSeed(privateKeyBytes) - publicKey := privateKey.Public().(ed25519.PublicKey) - - return publicKey, privateKey, privateKeyBytes, nil -} diff --git a/registrar-cli/cmd/create_farm.go b/registrar-cli/cmd/create_farm.go index 466bf92..7605913 100644 --- a/registrar-cli/cmd/create_farm.go +++ b/registrar-cli/cmd/create_farm.go @@ -2,6 +2,7 @@ package cmd import ( + "crypto/ed25519" "encoding/hex" "fmt" @@ -49,7 +50,8 @@ var createFarmCmd = &cobra.Command{ return err } - cli, err := client.NewRegistrarClient(u, seedBytes) + privateKey := ed25519.NewKeyFromSeed(seedBytes) + cli, err := client.NewRegistrarClient(u, privateKey) if err != nil { return err } diff --git a/registrar-cli/cmd/get_account.go b/registrar-cli/cmd/get_account.go index 46e3c74..f8cb2d3 100644 --- a/registrar-cli/cmd/get_account.go +++ b/registrar-cli/cmd/get_account.go @@ -2,6 +2,7 @@ package cmd import ( + "crypto/ed25519" "encoding/hex" "fmt" @@ -50,7 +51,8 @@ var getAccountCmd = &cobra.Command{ return err } - cli, err := client.NewRegistrarClient(u, seedBytes) + privateKey := ed25519.NewKeyFromSeed(seedBytes) + cli, err := client.NewRegistrarClient(u, privateKey) if err != nil { return err } diff --git a/registrar-cli/cmd/get_node.go b/registrar-cli/cmd/get_node.go index b292ad4..171a637 100644 --- a/registrar-cli/cmd/get_node.go +++ b/registrar-cli/cmd/get_node.go @@ -2,6 +2,7 @@ package cmd import ( + "crypto/ed25519" "encoding/hex" "fmt" @@ -45,7 +46,8 @@ var getNodeCmd = &cobra.Command{ return err } - cli, err := client.NewRegistrarClient(u, seedBytes) + privateKey := ed25519.NewKeyFromSeed(seedBytes) + cli, err := client.NewRegistrarClient(u, privateKey) if err != nil { return err } diff --git a/registrar-cli/cmd/get_zos_version.go b/registrar-cli/cmd/get_zos_version.go index e1d98ab..8e21f75 100644 --- a/registrar-cli/cmd/get_zos_version.go +++ b/registrar-cli/cmd/get_zos_version.go @@ -2,6 +2,7 @@ package cmd import ( + "crypto/ed25519" "encoding/hex" "fmt" @@ -35,7 +36,8 @@ var getZosVersionCmd = &cobra.Command{ return err } - cli, err := client.NewRegistrarClient(u, seedBytes) + privateKey := ed25519.NewKeyFromSeed(seedBytes) + cli, err := client.NewRegistrarClient(u, privateKey) if err != nil { return err } diff --git a/registrar-cli/cmd/update_account.go b/registrar-cli/cmd/update_account.go index a7373e2..5b51614 100644 --- a/registrar-cli/cmd/update_account.go +++ b/registrar-cli/cmd/update_account.go @@ -2,6 +2,7 @@ package cmd import ( + "crypto/ed25519" "encoding/hex" "fmt" @@ -49,7 +50,8 @@ var UpdateAccountCmd = &cobra.Command{ return err } - cli, err := client.NewRegistrarClient(u, seedBytes) + privateKey := ed25519.NewKeyFromSeed(seedBytes) + cli, err := client.NewRegistrarClient(u, privateKey) if err != nil { return err } diff --git a/registrar-cli/cmd/update_farm.go b/registrar-cli/cmd/update_farm.go index 215a0b2..57abf25 100644 --- a/registrar-cli/cmd/update_farm.go +++ b/registrar-cli/cmd/update_farm.go @@ -2,6 +2,7 @@ package cmd import ( + "crypto/ed25519" "encoding/hex" "fmt" @@ -54,7 +55,8 @@ var UpdateFarmCmd = &cobra.Command{ return err } - cli, err := client.NewRegistrarClient(u, seedBytes) + privateKey := ed25519.NewKeyFromSeed(seedBytes) + cli, err := client.NewRegistrarClient(u, privateKey) if err != nil { return err } diff --git a/registrar-cli/go.mod b/registrar-cli/go.mod index f6a0362..b331206 100644 --- a/registrar-cli/go.mod +++ b/registrar-cli/go.mod @@ -5,7 +5,7 @@ go 1.21.0 require ( github.com/rs/zerolog v1.33.0 github.com/spf13/cobra v1.9.1 - github.com/threefoldtech/tfgrid4-sdk-go/node-registrar v0.0.0-20250226140024-dc119126c93f + github.com/threefoldtech/tfgrid4-sdk-go/node-registrar v0.0.0-20250226194238-c27651fbdd6e ) require ( diff --git a/registrar-cli/go.sum b/registrar-cli/go.sum index 01ae64d..37805b1 100644 --- a/registrar-cli/go.sum +++ b/registrar-cli/go.sum @@ -27,6 +27,8 @@ github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOf github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/threefoldtech/tfgrid4-sdk-go/node-registrar v0.0.0-20250226140024-dc119126c93f h1:IJ0BULHQuYWT6UFFiZEhEB0QyFSSbyCPgcKaAVII4a4= github.com/threefoldtech/tfgrid4-sdk-go/node-registrar v0.0.0-20250226140024-dc119126c93f/go.mod h1:x6Sluj6YKfelWzcNwsD2oqGO8dpRlH7fbmeIqEsK8hI= +github.com/threefoldtech/tfgrid4-sdk-go/node-registrar v0.0.0-20250226194238-c27651fbdd6e h1:n/hq2t7txZNuQ53EMR+ikwvu3bSvZIerm1d6JiXbmro= +github.com/threefoldtech/tfgrid4-sdk-go/node-registrar v0.0.0-20250226194238-c27651fbdd6e/go.mod h1:x6Sluj6YKfelWzcNwsD2oqGO8dpRlH7fbmeIqEsK8hI= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= From 5fe4a7f5ee61bfcceea9fd82c9499755b718c745 Mon Sep 17 00:00:00 2001 From: Eslam-Nawara Date: Thu, 27 Feb 2025 13:20:39 +0200 Subject: [PATCH 03/17] add readme to registrar cli --- registrar-cli/README.md | 166 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 158 insertions(+), 8 deletions(-) diff --git a/registrar-cli/README.md b/registrar-cli/README.md index 9c15678..9fa7fe8 100644 --- a/registrar-cli/README.md +++ b/registrar-cli/README.md @@ -15,7 +15,7 @@ This tool allows users to create/get/update farm/account/node on a specified ne 2. Navigate to the project directory: ```sh - cd node-registrar/tools/registrar-cli + cd tfgrid4-sdk-go/registrar-cli/ ``` 3. Build the application: @@ -26,18 +26,168 @@ This tool allows users to create/get/update farm/account/node on a specified ne ## Usage +## Create Command + +Create command allows users to create an account or a farm + +### Create New Account + +**Flags**: + +- `--network` (required): Specifies the network (`dev`, `qa`, `test`, `main`). +- `--seed` (optional): create an account of a seed. +- `--relays` (optional): relays urls. +- `--rmb-enc-key` (optional): rmb encryption key. + +**Example Usage**: + +```sh +➜ registrar-cli git:(add-registrar-cli-tool) ✗ ./registrar-cli create account --network dev +5:00PM INF New Seed (Hex): 7f40eb52530f1a1c1253873cf17d44bd66d3e5ba71a14d0deba7df5517c9ed12 +5:00PM INF public key (Hex): c394d84de07fac2b2477588dace29a165a469fe0a9dbc8056686d3340054bf9d +5:00PM INF account is created successfully twinID=33 +``` + +### Create New Farm + +**Flags**: + +- `--farm_name` (required): The name of the farm to create. +- `--network` (required): Specifies the network (`dev`, `qa`, `test`, `main`). +- `--seed` (required): A hexadecimal representation of the seed. +- `--dedicated` (optional default: false): is the farm dedicated. + +**Example Usage**: + +```sh +➜ registrar-cli git:(add-registrar-cli-tool) ✗ ./registrar-cli create farm --farm-name testFarm1 --seed --network dev +5:03PM INF farm is created successfully farmID=12 +``` + +## Get Command + +Get command allows users to get account, farm, node or zos version. + +### Get Account + +**Flags**: + +- `--network` (required): Specifies the network (`dev`, `qa`, `test`, `main`). +- `--twin-id` (optional): twin id of the account needed to be loaded. +- `--public-key` (optional): public key of the account needed to be loaded. + +**Example Usage**: + +```sh +➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go get account --network dev --twin-id 33 +5:00PM INF account={"public_key":"w5TYTeB/rCskd1iNrOKaFlpGn+Cp28gFZobTNABUv50=","relays":[],"rmb_enc_key":"","twin_id":33} +➜ +➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go get account --network dev --public-key +5:01PM INF account={"public_key":"w5TYTeB/rCskd1iNrOKaFlpGn+Cp28gFZobTNABUv50=","relays":[],"rmb_enc_key":"","twin_id":33} +``` + +### Get Farm + +**Flags**: + +- `--network` (required): Specifies the network (`dev`, `qa`, `test`, `main`). +- `--farm-id` (optional): id of the farm needed to be loaded. + +**Example Usage**: + +```sh +➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go get farm --farm-id 12 --network dev +5:03PM INF farm={"dedicated":false,"farm_id":12,"farm_name":"testFarm1","twin_id":33} +``` + +### Get Node + +**Flags**: + +- `--network` (required): Specifies the network (`dev`, `qa`, `test`, `main`). +- `--node-id` (optional): id of the node needed to be loaded. +- `--twin-id` (optional): twin id of the node needed to be loaded. + +**Example Usage**: + +```sh +➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go get node --network dev --node-id 1 +12:36PM INF node={"Approved":false,"farm_id":4,"interfaces":[{"ips":"192.168.123.22","mac":"54:fe:9a:b0:73:61","name":"zos"}],"location":{"city":"Cairo","country":"Egypt","latitude":"30.0588","longitude":"31.2268"},"node_id":1,"resources":{"cru":4,"hru":1073741824000,"mru":6230032384,"sru":1610612736000},"secure_boot":false,"serial_number":"Not Specified","twin_id":5,"uptime":null,"virtualized":true} +➜ +➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go get node --network dev --twin-id 5 +12:36PM INF node={"Approved":false,"farm_id":4,"interfaces":[{"ips":"192.168.123.22","mac":"54:fe:9a:b0:73:61","name":"zos"}],"location":{"city":"Cairo","country":"Egypt","latitude":"30.0588","longitude":"31.2268"},"node_id":1,"resources":{"cru":4,"hru":1073741824000,"mru":6230032384,"sru":1610612736000},"secure_boot":false,"serial_number":"Not Specified","twin_id":5,"uptime":null,"virtualized":true} +``` + +### Get Zos Version + +**Flags**: + +- `--network` (required): Specifies the network (`dev`, `qa`, `test`, `main`). + +**Example Usage**: + +```sh +➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go get version --network dev +12:40PM INF zosVersion={"safe_to_upgrade":true,"version":"v0.1.8"} +``` + +## Update Command + +Update command allows users to update account, farm or zos version. + +### Update Account + +**Flags**: + +- `--network` (required): Specifies the network (`dev`, `qa`, `test`, `main`). +- `--seed` (required): A hexadecimal representation of the seed. +- `--relays` (optional): new relays urls. +- `--rmb-enc-key` (optional): new rmb encryption key. + +**Example Usage**: + ```sh -./registrar-cli -seed -network -farm_name +➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go update account --network dev --seed --relays wss://relay.dev.grid.tf +5:02PM INF account is updated successfully +➜ +➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go get account --network dev --twin-id 33 +5:02PM INF account={"public_key":"w5TYTeB/rCskd1iNrOKaFlpGn+Cp28gFZobTNABUv50=","relays":["wss://relay.dev.grid.tf"],"rmb_enc_key":"","twin_id":33} ``` -### Parameters +### Update Farm + +**Flags**: + +- `--network` (required): Specifies the network (`dev`, `qa`, `test`, `main`). +- `--seed` (required): A hexadecimal representation of the seed. +- `--farm-id` (optional): id of the farm needed to be loaded. +- `--farm_name` (optional): The new name of the farm. +- `--dedicated` (optional): update the farm to dedicated. + +**Example Usage**: + +```sh +➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go update farm --farm-name notTestFarm1 --seed --network dev --farm-id 12 +5:04PM INF farm is updated successfully +➜ +➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go get farm --farm-id 12 --network dev +5:04PM INF farm={"dedicated":false,"farm_id":12,"farm_name":"notTestFarm1","twin_id":33} +``` + +### Update Zos Version + +**Flags**: -- `-seed` (required): A hexadecimal string used as a private key seed. -- `-network` (required): Specifies the network (`dev`, `qa`, `test`, `main`). -- `-farm_name` (required): The name of the farm to create. +- `--network` (required): Specifies the network (`dev`, `qa`, `test`, `main`). +- `--version` (required): new zos version to be set on specific network (`v0.1.x`) +- `--safe-to-upgrade` (required): if this version is safe to upgrade -### Example Usage +**Example Usage**: ```sh -./registrar-cli -seed aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899 -network dev -farm_name MyFarm +➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go update version --network dev --version v0.1.8 --safe-to-upgrade --seed +5:07PM INF farm is updated successfully +➜ +➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go get version --network dev +5:07PM INF zosVersion={"safe_to_upgrade":true,"version":"v0.1.8"} ``` From 10e8fa0c57afc4d2819481ccbd5665f0a6d865d3 Mon Sep 17 00:00:00 2001 From: Eslam-Nawara Date: Mon, 3 Mar 2025 12:50:07 +0200 Subject: [PATCH 04/17] move cli logic to internal pkg --- registrar-cli/cmd/create_account.go | 58 ++--------- registrar-cli/cmd/create_farm.go | 40 ++------ registrar-cli/cmd/get_account.go | 54 ++--------- registrar-cli/cmd/get_farm.go | 38 ++------ registrar-cli/cmd/get_node.go | 49 ++-------- registrar-cli/cmd/get_zos_version.go | 32 +------ registrar-cli/cmd/update_account.go | 46 ++------- registrar-cli/cmd/update_farm.go | 48 ++-------- registrar-cli/cmd/update_zos_version.go | 35 ++----- registrar-cli/internal/cmd/create.go | 74 +++++++++++++++ registrar-cli/internal/cmd/get.go | 111 ++++++++++++++++++++++ registrar-cli/internal/cmd/update.go | 99 +++++++++++++++++++ registrar-cli/internal/seedgen/seedgen.go | 33 +++++++ 13 files changed, 380 insertions(+), 337 deletions(-) create mode 100644 registrar-cli/internal/cmd/create.go create mode 100644 registrar-cli/internal/cmd/get.go create mode 100644 registrar-cli/internal/cmd/update.go create mode 100644 registrar-cli/internal/seedgen/seedgen.go diff --git a/registrar-cli/cmd/create_account.go b/registrar-cli/cmd/create_account.go index 955589e..f87fe28 100644 --- a/registrar-cli/cmd/create_account.go +++ b/registrar-cli/cmd/create_account.go @@ -2,70 +2,37 @@ package cmd import ( - "crypto/ed25519" - "crypto/rand" - "encoding/hex" - "fmt" - "github.com/rs/zerolog/log" "github.com/spf13/cobra" - "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" + "github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli/internal/cmd" ) // createAccountCmd represents the cancel command var createAccountCmd = &cobra.Command{ Use: "account", Short: "create new account in node registrar", - RunE: func(cmd *cobra.Command, args []string) error { - seed, err := cmd.Flags().GetString("seed") - if err != nil { - return err - } - - network, err := cmd.Flags().GetString("network") - if err != nil { - return err - } - - relays, err := cmd.Flags().GetStringArray("relays") + RunE: func(cobraCmd *cobra.Command, args []string) error { + seed, err := cobraCmd.Flags().GetString("seed") if err != nil { return err } - rmbEncKey, err := cmd.Flags().GetString("rmb-enc-key") + network, err := cobraCmd.Flags().GetString("network") if err != nil { return err } - u, ok := urls[network] - if !ok { - return fmt.Errorf("invalid network %s", network) - } - - if len(seed) == 0 { - seed, err = generateRandomSeed() - if err != nil { - return err - } - log.Info().Msgf("New Seed (Hex): %s", seed) - } - - seedBytes, err := hex.DecodeString(seed) + relays, err := cobraCmd.Flags().GetStringArray("relays") if err != nil { return err } - privateKey := ed25519.NewKeyFromSeed(seedBytes) - publicKey := privateKey.Public().(ed25519.PublicKey) - - log.Info().Msgf("public key (Hex): %s", hex.EncodeToString(publicKey)) - - cli, err := client.NewRegistrarClient(u, privateKey) + rmbEncKey, err := cobraCmd.Flags().GetString("rmb-enc-key") if err != nil { return err } - account, err := cli.CreateAccount(relays, rmbEncKey) + account, err := cmd.CreaeteAccount(seed, network, relays, rmbEncKey) if err != nil { return err } @@ -83,14 +50,3 @@ func init() { createAccountCmd.Flags().StringArrayP("relays", "r", nil, "relays urls") createAccountCmd.Flags().StringP("rmb-enc-key", "k", "", "rmb encryption key") } - -func generateRandomSeed() (string, error) { - s := make([]byte, 32) - _, err := rand.Read(s) - if err != nil { - return "", err - } - - seed := hex.EncodeToString(s) - return seed, nil -} diff --git a/registrar-cli/cmd/create_farm.go b/registrar-cli/cmd/create_farm.go index 7605913..3f3d231 100644 --- a/registrar-cli/cmd/create_farm.go +++ b/registrar-cli/cmd/create_farm.go @@ -2,66 +2,42 @@ package cmd import ( - "crypto/ed25519" - "encoding/hex" - "fmt" - "github.com/rs/zerolog/log" "github.com/spf13/cobra" - "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" + "github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli/internal/cmd" ) // createFarmCmd represents the cancel command var createFarmCmd = &cobra.Command{ Use: "farm", Short: "create new farm in node registrar", - RunE: func(cmd *cobra.Command, args []string) error { - seed, err := cmd.Flags().GetString("seed") + RunE: func(cobraCmd *cobra.Command, args []string) error { + seed, err := cobraCmd.Flags().GetString("seed") if err != nil { return err } - network, err := cmd.Flags().GetString("network") + network, err := cobraCmd.Flags().GetString("network") if err != nil { return err } - farmName, err := cmd.Flags().GetString("farm-name") - if err != nil { - return err - } - - dedicated, err := cmd.Flags().GetBool("dedicated") - if err != nil { - return err - } - - u, ok := urls[network] - if !ok { - return fmt.Errorf("invalid network %s", network) - } - - if len(seed) == 0 { - return fmt.Errorf("can not initialize registrar client with no seed") - } - - seedBytes, err := hex.DecodeString(seed) + farmName, err := cobraCmd.Flags().GetString("farm-name") if err != nil { return err } - privateKey := ed25519.NewKeyFromSeed(seedBytes) - cli, err := client.NewRegistrarClient(u, privateKey) + dedicated, err := cobraCmd.Flags().GetBool("dedicated") if err != nil { return err } - farm, err := cli.CreateFarm(farmName, dedicated) + farmID, err := cmd.CreaeteFarm(seed, network, farmName, dedicated) if err != nil { return err } - log.Info().Uint64("farmID", farm).Msg("farm is created successfully") + log.Info().Uint64("farmID", farmID).Msg("farm is created successfully") return nil }, diff --git a/registrar-cli/cmd/get_account.go b/registrar-cli/cmd/get_account.go index f8cb2d3..834c20a 100644 --- a/registrar-cli/cmd/get_account.go +++ b/registrar-cli/cmd/get_account.go @@ -2,77 +2,37 @@ package cmd import ( - "crypto/ed25519" - "encoding/hex" - "fmt" - "github.com/rs/zerolog/log" "github.com/spf13/cobra" - "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" + "github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli/internal/cmd" ) // getAccountCmd represents the cancel command var getAccountCmd = &cobra.Command{ Use: "account", Short: "get account from node registrar", - RunE: func(cmd *cobra.Command, args []string) error { - network, err := cmd.Flags().GetString("network") + RunE: func(cobraCmd *cobra.Command, args []string) error { + network, err := cobraCmd.Flags().GetString("network") if err != nil { return err } - twinID, err := cmd.Flags().GetUint64("twin-id") + twinID, err := cobraCmd.Flags().GetUint64("twin-id") if err != nil { return err } - pk, err := cmd.Flags().GetString("public-key") + pk, err := cobraCmd.Flags().GetString("public-key") if err != nil { return err } - u, ok := urls[network] - if !ok { - return fmt.Errorf("invalid network %s", network) - } - - seed, err := generateRandomSeed() + account, err := cmd.GetAccount(network, twinID, pk) if err != nil { return err } - seedBytes, err := hex.DecodeString(seed) - if err != nil { - return err - } - - publicKey, err := hex.DecodeString(pk) - if err != nil { - return err - } - - privateKey := ed25519.NewKeyFromSeed(seedBytes) - cli, err := client.NewRegistrarClient(u, privateKey) - if err != nil { - return err - } - - if twinID != 0 { - account, err := cli.GetAccount(twinID) - if err != nil { - return err - } - log.Info().Any("account", account).Send() - - } else if len(publicKey) != 0 { - account, err := cli.GetAccountByPK(publicKey) - if err != nil { - return err - } - log.Info().Any("account", account).Send() - } else { - return fmt.Errorf("you need to provide either twin id or public key to load an account") - } + log.Info().Any("account", account).Send() return nil }, diff --git a/registrar-cli/cmd/get_farm.go b/registrar-cli/cmd/get_farm.go index f6b8078..b39f540 100644 --- a/registrar-cli/cmd/get_farm.go +++ b/registrar-cli/cmd/get_farm.go @@ -2,60 +2,38 @@ package cmd import ( - "encoding/hex" "fmt" "github.com/rs/zerolog/log" "github.com/spf13/cobra" - "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" + "github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli/internal/cmd" ) // getFarmCmd represents the cancel command var getFarmCmd = &cobra.Command{ Use: "farm", Short: "get farm from node registrar", - RunE: func(cmd *cobra.Command, args []string) error { - network, err := cmd.Flags().GetString("network") + RunE: func(cobraCmd *cobra.Command, args []string) error { + network, err := cobraCmd.Flags().GetString("network") if err != nil { return err } - farmID, err := cmd.Flags().GetUint64("farm-id") + farmID, err := cobraCmd.Flags().GetUint64("farm-id") if err != nil { return err } - u, ok := urls[network] - if !ok { - return fmt.Errorf("invalid network %s", network) + if farmID == 0 { + return fmt.Errorf("you need to provide farm id to load a farm") } - seed, err := generateRandomSeed() + farm, err := cmd.GetFarm(network, farmID) if err != nil { return err } - seedBytes, err := hex.DecodeString(seed) - if err != nil { - return err - } - - cli, err := client.NewRegistrarClient(u, seedBytes) - if err != nil { - return err - } - - if farmID != 0 { - farm, err := cli.GetFarm(farmID) - if err != nil { - return err - } - log.Info().Any("farm", farm).Send() - - } else { - return fmt.Errorf("you need to provide either farm id to load a farm") - } - + log.Info().Any("farm", farm).Send() return nil }, } diff --git a/registrar-cli/cmd/get_node.go b/registrar-cli/cmd/get_node.go index 171a637..159745d 100644 --- a/registrar-cli/cmd/get_node.go +++ b/registrar-cli/cmd/get_node.go @@ -2,72 +2,37 @@ package cmd import ( - "crypto/ed25519" - "encoding/hex" - "fmt" - "github.com/rs/zerolog/log" "github.com/spf13/cobra" - "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" + "github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli/internal/cmd" ) // getNodeCmd represents the cancel command var getNodeCmd = &cobra.Command{ Use: "node", Short: "get node from node registrar", - RunE: func(cmd *cobra.Command, args []string) error { - network, err := cmd.Flags().GetString("network") + RunE: func(cobraCmd *cobra.Command, args []string) error { + network, err := cobraCmd.Flags().GetString("network") if err != nil { return err } - nodeID, err := cmd.Flags().GetUint64("node-id") + nodeID, err := cobraCmd.Flags().GetUint64("node-id") if err != nil { return err } - twinID, err := cmd.Flags().GetUint64("twin-id") - if err != nil { - return err - } - - u, ok := urls[network] - if !ok { - return fmt.Errorf("invalid network %s", network) - } - - seed, err := generateRandomSeed() + twinID, err := cobraCmd.Flags().GetUint64("twin-id") if err != nil { return err } - seedBytes, err := hex.DecodeString(seed) + node, err := cmd.GetNode(network, nodeID, twinID) if err != nil { return err } - privateKey := ed25519.NewKeyFromSeed(seedBytes) - cli, err := client.NewRegistrarClient(u, privateKey) - if err != nil { - return err - } - - if nodeID != 0 { - node, err := cli.GetNode(nodeID) - if err != nil { - return err - } - log.Info().Any("node", node).Send() - - } else if twinID != 0 { - node, err := cli.GetNodeByTwinID(twinID) - if err != nil { - return err - } - log.Info().Any("node", node).Send() - } else { - return fmt.Errorf("you need to provide either twin id or node id to load a node") - } + log.Info().Any("node", node).Send() return nil }, diff --git a/registrar-cli/cmd/get_zos_version.go b/registrar-cli/cmd/get_zos_version.go index 8e21f75..67e5013 100644 --- a/registrar-cli/cmd/get_zos_version.go +++ b/registrar-cli/cmd/get_zos_version.go @@ -2,50 +2,26 @@ package cmd import ( - "crypto/ed25519" - "encoding/hex" - "fmt" - "github.com/rs/zerolog/log" "github.com/spf13/cobra" - "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" + "github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli/internal/cmd" ) // getZosVersionCmd represents the zos version command var getZosVersionCmd = &cobra.Command{ Use: "version", Short: "get zos version from Threefold grid4", - RunE: func(cmd *cobra.Command, args []string) error { - network, err := cmd.Flags().GetString("network") - if err != nil { - return err - } - - u, ok := urls[network] - if !ok { - return fmt.Errorf("invalid network %s", network) - } - - seed, err := generateRandomSeed() + RunE: func(cobraCmd *cobra.Command, args []string) error { + network, err := cobraCmd.Flags().GetString("network") if err != nil { return err } - seedBytes, err := hex.DecodeString(seed) + version, err := cmd.GetVersion(network) if err != nil { return err } - privateKey := ed25519.NewKeyFromSeed(seedBytes) - cli, err := client.NewRegistrarClient(u, privateKey) - if err != nil { - return err - } - - version, err := cli.GetZosVersion() - if err != nil { - return err - } log.Info().Any("zosVersion", version).Send() return nil diff --git a/registrar-cli/cmd/update_account.go b/registrar-cli/cmd/update_account.go index 5b51614..c520081 100644 --- a/registrar-cli/cmd/update_account.go +++ b/registrar-cli/cmd/update_account.go @@ -2,73 +2,41 @@ package cmd import ( - "crypto/ed25519" - "encoding/hex" - "fmt" - "github.com/rs/zerolog/log" "github.com/spf13/cobra" - "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" + "github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli/internal/cmd" ) // UpdateAccountCmd represents the cancel command var UpdateAccountCmd = &cobra.Command{ Use: "account", Short: "update account in node registrar", - RunE: func(cmd *cobra.Command, args []string) error { - seed, err := cmd.Flags().GetString("seed") - if err != nil { - return err - } - - network, err := cmd.Flags().GetString("network") + RunE: func(cobraCmd *cobra.Command, args []string) error { + seed, err := cobraCmd.Flags().GetString("seed") if err != nil { return err } - relays, err := cmd.Flags().GetStringArray("relays") + network, err := cobraCmd.Flags().GetString("network") if err != nil { return err } - rmbEncKey, err := cmd.Flags().GetString("rmb-enc-key") + relays, err := cobraCmd.Flags().GetStringArray("relays") if err != nil { return err } - u, ok := urls[network] - if !ok { - return fmt.Errorf("invalid network %s", network) - } - - if len(seed) == 0 { - return fmt.Errorf("can not initialize registrar client with no seed") - } - - seedBytes, err := hex.DecodeString(seed) + rmbEncKey, err := cobraCmd.Flags().GetString("rmb-enc-key") if err != nil { return err } - privateKey := ed25519.NewKeyFromSeed(seedBytes) - cli, err := client.NewRegistrarClient(u, privateKey) + err = cmd.UpdateAccount(seed, network, relays, rmbEncKey) if err != nil { return err } - var opts []client.UpdateAccountOpts - if len(relays) > 0 { - opts = append(opts, client.UpdateAccountWithRelays(relays)) - } - - if len(rmbEncKey) > 0 { - opts = append(opts, client.UpdateAccountWithRMBEncKey(rmbEncKey)) - } - - err = cli.UpdateAccount(opts...) - if err != nil { - return err - } log.Info().Msg("account is updated successfully") return nil diff --git a/registrar-cli/cmd/update_farm.go b/registrar-cli/cmd/update_farm.go index 57abf25..394b66d 100644 --- a/registrar-cli/cmd/update_farm.go +++ b/registrar-cli/cmd/update_farm.go @@ -2,78 +2,46 @@ package cmd import ( - "crypto/ed25519" - "encoding/hex" - "fmt" - "github.com/rs/zerolog/log" "github.com/spf13/cobra" - "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" + "github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli/internal/cmd" ) // UpdateFarmCmd represents the update farm command var UpdateFarmCmd = &cobra.Command{ Use: "farm", Short: "update farm in node registrar", - RunE: func(cmd *cobra.Command, args []string) error { - seed, err := cmd.Flags().GetString("seed") - if err != nil { - return err - } - - network, err := cmd.Flags().GetString("network") + RunE: func(cobraCmd *cobra.Command, args []string) error { + seed, err := cobraCmd.Flags().GetString("seed") if err != nil { return err } - farmID, err := cmd.Flags().GetUint64("farm-id") + network, err := cobraCmd.Flags().GetString("network") if err != nil { return err } - farmName, err := cmd.Flags().GetString("farm-name") + farmID, err := cobraCmd.Flags().GetUint64("farm-id") if err != nil { return err } - dedicated, err := cmd.Flags().GetBool("dedicated") + farmName, err := cobraCmd.Flags().GetString("farm-name") if err != nil { return err } - u, ok := urls[network] - if !ok { - return fmt.Errorf("invalid network %s", network) - } - - if len(seed) == 0 { - return fmt.Errorf("can not initialize registrar client with no seed") - } - - seedBytes, err := hex.DecodeString(seed) + dedicated, err := cobraCmd.Flags().GetBool("dedicated") if err != nil { return err } - privateKey := ed25519.NewKeyFromSeed(seedBytes) - cli, err := client.NewRegistrarClient(u, privateKey) + err = cmd.UpdateFarm(seed, network, farmID, farmName, dedicated) if err != nil { return err } - var opts []client.UpdateFarmOpts - if len(farmName) > 0 { - opts = append(opts, client.UpdateFarmWithName(farmName)) - } - - if dedicated { - opts = append(opts, client.UpdateFarmWithDedicated()) - } - - err = cli.UpdateFarm(farmID, opts...) - if err != nil { - return err - } log.Info().Msg("farm is updated successfully") return nil diff --git a/registrar-cli/cmd/update_zos_version.go b/registrar-cli/cmd/update_zos_version.go index 9c36d9e..a6165ff 100644 --- a/registrar-cli/cmd/update_zos_version.go +++ b/registrar-cli/cmd/update_zos_version.go @@ -2,62 +2,41 @@ package cmd import ( - "encoding/hex" - "fmt" - "github.com/rs/zerolog/log" "github.com/spf13/cobra" - "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" + "github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli/internal/cmd" ) // UpdateZosVersionCmd represents the update farm command var UpdateZosVersionCmd = &cobra.Command{ Use: "version", Short: "update zos version in node registrar", - RunE: func(cmd *cobra.Command, args []string) error { - seed, err := cmd.Flags().GetString("seed") - if err != nil { - return err - } - - network, err := cmd.Flags().GetString("network") + RunE: func(cobraCmd *cobra.Command, args []string) error { + seed, err := cobraCmd.Flags().GetString("seed") if err != nil { return err } - version, err := cmd.Flags().GetString("version") + network, err := cobraCmd.Flags().GetString("network") if err != nil { return err } - safeToUpgrade, err := cmd.Flags().GetBool("safe-to-upgrade") + version, err := cobraCmd.Flags().GetString("version") if err != nil { return err } - u, ok := urls[network] - if !ok { - return fmt.Errorf("invalid network %s", network) - } - - if len(seed) == 0 { - return fmt.Errorf("can not initialize registrar client with no seed") - } - - seedBytes, err := hex.DecodeString(seed) + safeToUpgrade, err := cobraCmd.Flags().GetBool("safe-to-upgrade") if err != nil { return err } - cli, err := client.NewRegistrarClient(u, seedBytes) + err = cmd.UpdateVersion(seed, network, version, safeToUpgrade) if err != nil { return err } - err = cli.SetZosVersion(version, safeToUpgrade) - if err != nil { - return err - } log.Info().Msg("farm is updated successfully") return nil diff --git a/registrar-cli/internal/cmd/create.go b/registrar-cli/internal/cmd/create.go new file mode 100644 index 0000000..a2f4add --- /dev/null +++ b/registrar-cli/internal/cmd/create.go @@ -0,0 +1,74 @@ +package cmd + +import ( + "crypto/ed25519" + "encoding/hex" + "fmt" + + "github.com/rs/zerolog/log" + "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" + "github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli/internal/seedgen" +) + +var urls = map[string]string{ + "dev": "https://registrar.dev4.grid.tf/v1", + "qa": "https://registrar.qa4.grid.tf/v1", + "test": "https://registrar.test4.grid.tf/v1", + "main": "https://registrar.prod4.grid.tf/v1", +} + +func CreaeteAccount(seed string, network string, relays []string, rmbEncKey string) (account client.Account, err error) { + u, ok := urls[network] + if !ok { + return account, fmt.Errorf("invalid network %s", network) + } + + if len(seed) == 0 { + seed, err = seedgen.GenerateRandomSeed() + if err != nil { + return + } + log.Info().Msgf("New Seed (Hex): %s", seed) + } + + seedBytes, err := hex.DecodeString(seed) + if err != nil { + return + } + + privateKey := ed25519.NewKeyFromSeed(seedBytes) + publicKey := privateKey.Public().(ed25519.PublicKey) + + log.Info().Msgf("public key (Hex): %s", hex.EncodeToString(publicKey)) + + cli, err := client.NewRegistrarClient(u, privateKey) + if err != nil { + return + } + + return cli.CreateAccount(relays, rmbEncKey) +} + +func CreaeteFarm(seed string, network string, farmName string, dedicated bool) (farmID uint64, err error) { + u, ok := urls[network] + if !ok { + return farmID, fmt.Errorf("invalid network %s", network) + } + + if len(seed) == 0 { + return farmID, fmt.Errorf("can not initialize registrar client with no seed") + } + + seedBytes, err := hex.DecodeString(seed) + if err != nil { + return + } + + privateKey := ed25519.NewKeyFromSeed(seedBytes) + cli, err := client.NewRegistrarClient(u, privateKey) + if err != nil { + return + } + + return cli.CreateFarm(farmName, dedicated) +} diff --git a/registrar-cli/internal/cmd/get.go b/registrar-cli/internal/cmd/get.go new file mode 100644 index 0000000..912cd04 --- /dev/null +++ b/registrar-cli/internal/cmd/get.go @@ -0,0 +1,111 @@ +package cmd + +import ( + "encoding/hex" + "fmt" + + "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" + "github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli/internal/seedgen" +) + +func GetAccount(network string, twinID uint64, pk string) (account client.Account, err error) { + u, ok := urls[network] + if !ok { + return account, fmt.Errorf("invalid network %s", network) + } + + privateKey, err := seedgen.GenerateRandomKey() + if err != nil { + return + } + + publicKey, err := hex.DecodeString(pk) + if err != nil { + return + } + + cli, err := client.NewRegistrarClient(u, privateKey) + if err != nil { + return + } + + if twinID != 0 { + return cli.GetAccount(twinID) + } else if len(publicKey) != 0 { + return cli.GetAccountByPK(publicKey) + } + + return account, fmt.Errorf("you need to provide either twin id or public key to load an account") +} + +func GetFarm(network string, farmID uint64) (farm client.Farm, err error) { + u, ok := urls[network] + if !ok { + return farm, fmt.Errorf("invalid network %s", network) + } + + privateKey, err := seedgen.GenerateRandomKey() + if err != nil { + return + } + + cli, err := client.NewRegistrarClient(u, privateKey) + if err != nil { + return + } + + return cli.GetFarm(farmID) +} + +func GetNode(network string, nodeID, twinID uint64) (node client.Node, err error) { + u, ok := urls[network] + if !ok { + return node, fmt.Errorf("invalid network %s", network) + } + + privateKey, err := seedgen.GenerateRandomKey() + if err != nil { + return + } + + cli, err := client.NewRegistrarClient(u, privateKey) + if err != nil { + return + } + + if nodeID != 0 { + node, err = cli.GetNode(nodeID) + if err != nil { + return + } + + } else if twinID != 0 { + node, err = cli.GetNodeByTwinID(twinID) + if err != nil { + return + } + } else { + return node, fmt.Errorf("you need to provide either twin id or node id to load a node") + } + + return +} + +func GetVersion(network string) (version client.ZosVersion, err error) { + u, ok := urls[network] + if !ok { + return version, fmt.Errorf("invalid network %s", network) + } + + privateKey, err := seedgen.GenerateRandomKey() + if err != nil { + return + } + + cli, err := client.NewRegistrarClient(u, privateKey) + if err != nil { + return + } + + return cli.GetZosVersion() +} diff --git a/registrar-cli/internal/cmd/update.go b/registrar-cli/internal/cmd/update.go new file mode 100644 index 0000000..03b2ca8 --- /dev/null +++ b/registrar-cli/internal/cmd/update.go @@ -0,0 +1,99 @@ +package cmd + +import ( + "crypto/ed25519" + "encoding/hex" + "fmt" + + "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" +) + +func UpdateAccount(seed string, network string, relays []string, rmbEncKey string) (err error) { + u, ok := urls[network] + if !ok { + return fmt.Errorf("invalid network %s", network) + } + + if len(seed) == 0 { + return fmt.Errorf("can not initialize registrar client with no seed") + } + + seedBytes, err := hex.DecodeString(seed) + if err != nil { + return err + } + + privateKey := ed25519.NewKeyFromSeed(seedBytes) + cli, err := client.NewRegistrarClient(u, privateKey) + if err != nil { + return err + } + + var opts []client.UpdateAccountOpts + if len(relays) > 0 { + opts = append(opts, client.UpdateAccountWithRelays(relays)) + } + + if len(rmbEncKey) > 0 { + opts = append(opts, client.UpdateAccountWithRMBEncKey(rmbEncKey)) + } + + return cli.UpdateAccount(opts...) +} + +func UpdateFarm(seed string, network string, farmID uint64, farmName string, dedicated bool) (err error) { + u, ok := urls[network] + if !ok { + return fmt.Errorf("invalid network %s", network) + } + + if len(seed) == 0 { + return fmt.Errorf("can not initialize registrar client with no seed") + } + + seedBytes, err := hex.DecodeString(seed) + if err != nil { + return err + } + + privateKey := ed25519.NewKeyFromSeed(seedBytes) + cli, err := client.NewRegistrarClient(u, privateKey) + if err != nil { + return err + } + + var opts []client.UpdateFarmOpts + if len(farmName) > 0 { + opts = append(opts, client.UpdateFarmWithName(farmName)) + } + + if dedicated { + opts = append(opts, client.UpdateFarmWithDedicated()) + } + + return cli.UpdateFarm(farmID, opts...) +} + +func UpdateVersion(seed string, network string, version string, safeToUpgrade bool) (err error) { + u, ok := urls[network] + if !ok { + return fmt.Errorf("invalid network %s", network) + } + + if len(seed) == 0 { + return fmt.Errorf("can not initialize registrar client with no seed") + } + + seedBytes, err := hex.DecodeString(seed) + if err != nil { + return err + } + + privateKey := ed25519.NewKeyFromSeed(seedBytes) + cli, err := client.NewRegistrarClient(u, privateKey) + if err != nil { + return err + } + + return cli.SetZosVersion(version, safeToUpgrade) +} diff --git a/registrar-cli/internal/seedgen/seedgen.go b/registrar-cli/internal/seedgen/seedgen.go new file mode 100644 index 0000000..27bed1a --- /dev/null +++ b/registrar-cli/internal/seedgen/seedgen.go @@ -0,0 +1,33 @@ +package seedgen + +import ( + "crypto/ed25519" + "crypto/rand" + "encoding/hex" +) + +func GenerateRandomSeed() (string, error) { + s := make([]byte, 32) + _, err := rand.Read(s) + if err != nil { + return "", err + } + + seed := hex.EncodeToString(s) + return seed, nil +} + +func GenerateRandomKey() ([]byte, error) { + seed, err := GenerateRandomSeed() + if err != nil { + return nil, err + } + + seedBytes, err := hex.DecodeString(seed) + if err != nil { + return nil, err + } + + privateKey := ed25519.NewKeyFromSeed(seedBytes) + return privateKey, nil +} From fcc2ae2a341b283e0fc412d7184f177aab909179 Mon Sep 17 00:00:00 2001 From: Eslam-Nawara Date: Mon, 3 Mar 2025 14:38:57 +0200 Subject: [PATCH 05/17] update how commands configured --- registrar-cli/cmd/account.go | 16 ++++++++++++++++ .../{create_account.go => account_create.go} | 16 ++++++++-------- .../cmd/{get_account.go => account_get.go} | 14 +++++++------- .../{update_account.go => account_update.go} | 16 ++++++++-------- registrar-cli/cmd/create.go | 16 ---------------- registrar-cli/cmd/farm.go | 16 ++++++++++++++++ .../cmd/{create_farm.go => farm_create.go} | 16 ++++++++-------- registrar-cli/cmd/{get_farm.go => farm_get.go} | 12 ++++++------ .../cmd/{update_farm.go => farm_update.go} | 18 +++++++++--------- registrar-cli/cmd/get.go | 16 ---------------- registrar-cli/cmd/node.go | 16 ++++++++++++++++ registrar-cli/cmd/{get_node.go => node_get.go} | 14 +++++++------- registrar-cli/cmd/update.go | 16 ---------------- registrar-cli/cmd/zos_version.go | 16 ++++++++++++++++ .../{get_zos_version.go => zos_version_get.go} | 12 ++++++------ ...te_zos_version.go => zos_version_update.go} | 6 +++--- 16 files changed, 126 insertions(+), 110 deletions(-) create mode 100644 registrar-cli/cmd/account.go rename registrar-cli/cmd/{create_account.go => account_create.go} (70%) rename registrar-cli/cmd/{get_account.go => account_get.go} (70%) rename registrar-cli/cmd/{update_account.go => account_update.go} (69%) delete mode 100644 registrar-cli/cmd/create.go create mode 100644 registrar-cli/cmd/farm.go rename registrar-cli/cmd/{create_farm.go => farm_create.go} (70%) rename registrar-cli/cmd/{get_farm.go => farm_get.go} (75%) rename registrar-cli/cmd/{update_farm.go => farm_update.go} (68%) delete mode 100644 registrar-cli/cmd/get.go create mode 100644 registrar-cli/cmd/node.go rename registrar-cli/cmd/{get_node.go => node_get.go} (72%) delete mode 100644 registrar-cli/cmd/update.go create mode 100644 registrar-cli/cmd/zos_version.go rename registrar-cli/cmd/{get_zos_version.go => zos_version_get.go} (66%) rename registrar-cli/cmd/{update_zos_version.go => zos_version_update.go} (90%) diff --git a/registrar-cli/cmd/account.go b/registrar-cli/cmd/account.go new file mode 100644 index 0000000..f3034a7 --- /dev/null +++ b/registrar-cli/cmd/account.go @@ -0,0 +1,16 @@ +// Package cmd for parsing command line arguments +package cmd + +import ( + "github.com/spf13/cobra" +) + +// accountCmd represents the account command +var accountCmd = &cobra.Command{ + Use: "account", + Short: "account command represents events on account on Threefold grid4", +} + +func init() { + rootCmd.AddCommand(accountCmd) +} diff --git a/registrar-cli/cmd/create_account.go b/registrar-cli/cmd/account_create.go similarity index 70% rename from registrar-cli/cmd/create_account.go rename to registrar-cli/cmd/account_create.go index f87fe28..0943a06 100644 --- a/registrar-cli/cmd/create_account.go +++ b/registrar-cli/cmd/account_create.go @@ -7,9 +7,9 @@ import ( "github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli/internal/cmd" ) -// createAccountCmd represents the cancel command -var createAccountCmd = &cobra.Command{ - Use: "account", +// accountCreateCmd represents the account create command +var accountCreateCmd = &cobra.Command{ + Use: "create", Short: "create new account in node registrar", RunE: func(cobraCmd *cobra.Command, args []string) error { seed, err := cobraCmd.Flags().GetString("seed") @@ -44,9 +44,9 @@ var createAccountCmd = &cobra.Command{ } func init() { - createCmd.AddCommand(createAccountCmd) - createAccountCmd.Flags().StringP("seed", "s", "", "account seed key") - createAccountCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") - createAccountCmd.Flags().StringArrayP("relays", "r", nil, "relays urls") - createAccountCmd.Flags().StringP("rmb-enc-key", "k", "", "rmb encryption key") + accountCmd.AddCommand(accountCreateCmd) + accountCreateCmd.Flags().StringP("seed", "s", "", "account seed key") + accountCreateCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") + accountCreateCmd.Flags().StringArrayP("relays", "r", nil, "relays urls") + accountCreateCmd.Flags().StringP("rmb-enc-key", "k", "", "rmb encryption key") } diff --git a/registrar-cli/cmd/get_account.go b/registrar-cli/cmd/account_get.go similarity index 70% rename from registrar-cli/cmd/get_account.go rename to registrar-cli/cmd/account_get.go index 834c20a..772f130 100644 --- a/registrar-cli/cmd/get_account.go +++ b/registrar-cli/cmd/account_get.go @@ -7,9 +7,9 @@ import ( "github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli/internal/cmd" ) -// getAccountCmd represents the cancel command -var getAccountCmd = &cobra.Command{ - Use: "account", +// accountGetCmd represents the account get command +var accountGetCmd = &cobra.Command{ + Use: "get", Short: "get account from node registrar", RunE: func(cobraCmd *cobra.Command, args []string) error { network, err := cobraCmd.Flags().GetString("network") @@ -39,8 +39,8 @@ var getAccountCmd = &cobra.Command{ } func init() { - getCmd.AddCommand(getAccountCmd) - getAccountCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") - getAccountCmd.Flags().Uint64P("twin-id", "i", 0, "twin id") - getAccountCmd.Flags().StringP("public-key", "k", "", "account public key") + accountCmd.AddCommand(accountGetCmd) + accountGetCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") + accountGetCmd.Flags().Uint64P("twin-id", "i", 0, "twin id") + accountGetCmd.Flags().StringP("public-key", "k", "", "account public key") } diff --git a/registrar-cli/cmd/update_account.go b/registrar-cli/cmd/account_update.go similarity index 69% rename from registrar-cli/cmd/update_account.go rename to registrar-cli/cmd/account_update.go index c520081..562d130 100644 --- a/registrar-cli/cmd/update_account.go +++ b/registrar-cli/cmd/account_update.go @@ -7,9 +7,9 @@ import ( "github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli/internal/cmd" ) -// UpdateAccountCmd represents the cancel command -var UpdateAccountCmd = &cobra.Command{ - Use: "account", +// accountUpdateCmd represents the account update command +var accountUpdateCmd = &cobra.Command{ + Use: "update", Short: "update account in node registrar", RunE: func(cobraCmd *cobra.Command, args []string) error { seed, err := cobraCmd.Flags().GetString("seed") @@ -44,9 +44,9 @@ var UpdateAccountCmd = &cobra.Command{ } func init() { - updateCmd.AddCommand(UpdateAccountCmd) - UpdateAccountCmd.Flags().StringP("seed", "s", "", "account seed key") - UpdateAccountCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") - UpdateAccountCmd.Flags().StringArrayP("relays", "r", nil, "relays urls") - UpdateAccountCmd.Flags().StringP("rmb-enc-key", "k", "", "rmb encryption key") + accountCmd.AddCommand(accountUpdateCmd) + accountUpdateCmd.Flags().StringP("seed", "s", "", "account seed key") + accountUpdateCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") + accountUpdateCmd.Flags().StringArrayP("relays", "r", nil, "relays urls") + accountUpdateCmd.Flags().StringP("rmb-enc-key", "k", "", "rmb encryption key") } diff --git a/registrar-cli/cmd/create.go b/registrar-cli/cmd/create.go deleted file mode 100644 index 9af0819..0000000 --- a/registrar-cli/cmd/create.go +++ /dev/null @@ -1,16 +0,0 @@ -// Package cmd for parsing command line arguments -package cmd - -import ( - "github.com/spf13/cobra" -) - -// createCmd represents the create command -var createCmd = &cobra.Command{ - Use: "create", - Short: "create account/farm on Threefold grid4", -} - -func init() { - rootCmd.AddCommand(createCmd) -} diff --git a/registrar-cli/cmd/farm.go b/registrar-cli/cmd/farm.go new file mode 100644 index 0000000..cf7e38c --- /dev/null +++ b/registrar-cli/cmd/farm.go @@ -0,0 +1,16 @@ +// Package cmd for parsing command line arguments +package cmd + +import ( + "github.com/spf13/cobra" +) + +// createCmd represents the farm command +var farmCmd = &cobra.Command{ + Use: "farm", + Short: "farm command represents events on farm on Threefold grid4", +} + +func init() { + rootCmd.AddCommand(farmCmd) +} diff --git a/registrar-cli/cmd/create_farm.go b/registrar-cli/cmd/farm_create.go similarity index 70% rename from registrar-cli/cmd/create_farm.go rename to registrar-cli/cmd/farm_create.go index 3f3d231..b8c1cc3 100644 --- a/registrar-cli/cmd/create_farm.go +++ b/registrar-cli/cmd/farm_create.go @@ -7,9 +7,9 @@ import ( "github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli/internal/cmd" ) -// createFarmCmd represents the cancel command -var createFarmCmd = &cobra.Command{ - Use: "farm", +// farmCreateCmd represents the farm create command +var farmCreateCmd = &cobra.Command{ + Use: "create", Short: "create new farm in node registrar", RunE: func(cobraCmd *cobra.Command, args []string) error { seed, err := cobraCmd.Flags().GetString("seed") @@ -44,9 +44,9 @@ var createFarmCmd = &cobra.Command{ } func init() { - createCmd.AddCommand(createFarmCmd) - createFarmCmd.Flags().StringP("seed", "s", "", "account seed key") - createFarmCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") - createFarmCmd.Flags().StringP("farm-name", "f", "", "farm name") - createFarmCmd.Flags().BoolP("dedicated", "d", false, "is farm dedicated") + farmCmd.AddCommand(farmCreateCmd) + farmCreateCmd.Flags().StringP("seed", "s", "", "account seed key") + farmCreateCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") + farmCreateCmd.Flags().StringP("farm-name", "f", "", "farm name") + farmCreateCmd.Flags().BoolP("dedicated", "d", false, "is farm dedicated") } diff --git a/registrar-cli/cmd/get_farm.go b/registrar-cli/cmd/farm_get.go similarity index 75% rename from registrar-cli/cmd/get_farm.go rename to registrar-cli/cmd/farm_get.go index b39f540..6aa3f80 100644 --- a/registrar-cli/cmd/get_farm.go +++ b/registrar-cli/cmd/farm_get.go @@ -9,9 +9,9 @@ import ( "github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli/internal/cmd" ) -// getFarmCmd represents the cancel command -var getFarmCmd = &cobra.Command{ - Use: "farm", +// farmGetCmd represents the farm get command +var farmGetCmd = &cobra.Command{ + Use: "get", Short: "get farm from node registrar", RunE: func(cobraCmd *cobra.Command, args []string) error { network, err := cobraCmd.Flags().GetString("network") @@ -39,7 +39,7 @@ var getFarmCmd = &cobra.Command{ } func init() { - getCmd.AddCommand(getFarmCmd) - getFarmCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") - getFarmCmd.Flags().Uint64P("farm-id", "i", 0, "farm id") + farmCmd.AddCommand(farmGetCmd) + farmGetCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") + farmGetCmd.Flags().Uint64P("farm-id", "i", 0, "farm id") } diff --git a/registrar-cli/cmd/update_farm.go b/registrar-cli/cmd/farm_update.go similarity index 68% rename from registrar-cli/cmd/update_farm.go rename to registrar-cli/cmd/farm_update.go index 394b66d..4286b9a 100644 --- a/registrar-cli/cmd/update_farm.go +++ b/registrar-cli/cmd/farm_update.go @@ -7,9 +7,9 @@ import ( "github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli/internal/cmd" ) -// UpdateFarmCmd represents the update farm command -var UpdateFarmCmd = &cobra.Command{ - Use: "farm", +// farmUpdateCmd represents the farm update command +var farmUpdateCmd = &cobra.Command{ + Use: "update", Short: "update farm in node registrar", RunE: func(cobraCmd *cobra.Command, args []string) error { seed, err := cobraCmd.Flags().GetString("seed") @@ -49,10 +49,10 @@ var UpdateFarmCmd = &cobra.Command{ } func init() { - updateCmd.AddCommand(UpdateFarmCmd) - UpdateFarmCmd.Flags().StringP("seed", "s", "", "account seed key") - UpdateFarmCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") - UpdateFarmCmd.Flags().Uint64P("farm-id", "i", 0, "farm id") - UpdateFarmCmd.Flags().String("farm-name", "", "new farm name") - UpdateFarmCmd.Flags().BoolP("dedicated", "d", false, "farm is dedicated") + farmCmd.AddCommand(farmUpdateCmd) + farmUpdateCmd.Flags().StringP("seed", "s", "", "account seed key") + farmUpdateCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") + farmUpdateCmd.Flags().Uint64P("farm-id", "i", 0, "farm id") + farmUpdateCmd.Flags().String("farm-name", "", "new farm name") + farmUpdateCmd.Flags().BoolP("dedicated", "d", false, "farm is dedicated") } diff --git a/registrar-cli/cmd/get.go b/registrar-cli/cmd/get.go deleted file mode 100644 index 20c04db..0000000 --- a/registrar-cli/cmd/get.go +++ /dev/null @@ -1,16 +0,0 @@ -// Package cmd for parsing command line arguments -package cmd - -import ( - "github.com/spf13/cobra" -) - -// getCmd represents the get command -var getCmd = &cobra.Command{ - Use: "get", - Short: "get account/farm/node from Threefold grid4", -} - -func init() { - rootCmd.AddCommand(getCmd) -} diff --git a/registrar-cli/cmd/node.go b/registrar-cli/cmd/node.go new file mode 100644 index 0000000..f5fc465 --- /dev/null +++ b/registrar-cli/cmd/node.go @@ -0,0 +1,16 @@ +// Package cmd for parsing command line arguments +package cmd + +import ( + "github.com/spf13/cobra" +) + +// nodeCmd represents the node command +var nodeCmd = &cobra.Command{ + Use: "node", + Short: "node command represents events on node on Threefold grid4", +} + +func init() { + rootCmd.AddCommand(nodeCmd) +} diff --git a/registrar-cli/cmd/get_node.go b/registrar-cli/cmd/node_get.go similarity index 72% rename from registrar-cli/cmd/get_node.go rename to registrar-cli/cmd/node_get.go index 159745d..d29121b 100644 --- a/registrar-cli/cmd/get_node.go +++ b/registrar-cli/cmd/node_get.go @@ -7,9 +7,9 @@ import ( "github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli/internal/cmd" ) -// getNodeCmd represents the cancel command -var getNodeCmd = &cobra.Command{ - Use: "node", +// nodeGetCmd represents the node get command +var nodeGetCmd = &cobra.Command{ + Use: "get", Short: "get node from node registrar", RunE: func(cobraCmd *cobra.Command, args []string) error { network, err := cobraCmd.Flags().GetString("network") @@ -39,8 +39,8 @@ var getNodeCmd = &cobra.Command{ } func init() { - getCmd.AddCommand(getNodeCmd) - getNodeCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") - getNodeCmd.Flags().Uint64("node-id", 0, "node id") - getNodeCmd.Flags().Uint64("twin-id", 0, "twin id") + nodeCmd.AddCommand(nodeGetCmd) + nodeGetCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") + nodeGetCmd.Flags().Uint64("node-id", 0, "node id") + nodeGetCmd.Flags().Uint64("twin-id", 0, "twin id") } diff --git a/registrar-cli/cmd/update.go b/registrar-cli/cmd/update.go deleted file mode 100644 index 4febe43..0000000 --- a/registrar-cli/cmd/update.go +++ /dev/null @@ -1,16 +0,0 @@ -// Package cmd for parsing command line arguments -package cmd - -import ( - "github.com/spf13/cobra" -) - -// updateCmd represents the update command -var updateCmd = &cobra.Command{ - Use: "update", - Short: "update account/farm/node on Threefold grid4", -} - -func init() { - rootCmd.AddCommand(updateCmd) -} diff --git a/registrar-cli/cmd/zos_version.go b/registrar-cli/cmd/zos_version.go new file mode 100644 index 0000000..d50412b --- /dev/null +++ b/registrar-cli/cmd/zos_version.go @@ -0,0 +1,16 @@ +// Package cmd for parsing command line arguments +package cmd + +import ( + "github.com/spf13/cobra" +) + +// zosVersionCmd represents the zos version command +var zosVersionCmd = &cobra.Command{ + Use: "zos-version", + Short: "zos-version command represents events on zos-version on Threefold grid4", +} + +func init() { + rootCmd.AddCommand(zosVersionCmd) +} diff --git a/registrar-cli/cmd/get_zos_version.go b/registrar-cli/cmd/zos_version_get.go similarity index 66% rename from registrar-cli/cmd/get_zos_version.go rename to registrar-cli/cmd/zos_version_get.go index 67e5013..1de09a9 100644 --- a/registrar-cli/cmd/get_zos_version.go +++ b/registrar-cli/cmd/zos_version_get.go @@ -7,10 +7,10 @@ import ( "github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli/internal/cmd" ) -// getZosVersionCmd represents the zos version command -var getZosVersionCmd = &cobra.Command{ - Use: "version", - Short: "get zos version from Threefold grid4", +// zosVersionGetCmd represents the zos version get command +var zosVersionGetCmd = &cobra.Command{ + Use: "get", + Short: "get zos version from node registrar", RunE: func(cobraCmd *cobra.Command, args []string) error { network, err := cobraCmd.Flags().GetString("network") if err != nil { @@ -29,6 +29,6 @@ var getZosVersionCmd = &cobra.Command{ } func init() { - getCmd.AddCommand(getZosVersionCmd) - getZosVersionCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") + zosVersionCmd.AddCommand(zosVersionGetCmd) + zosVersionGetCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") } diff --git a/registrar-cli/cmd/update_zos_version.go b/registrar-cli/cmd/zos_version_update.go similarity index 90% rename from registrar-cli/cmd/update_zos_version.go rename to registrar-cli/cmd/zos_version_update.go index a6165ff..d5adfc8 100644 --- a/registrar-cli/cmd/update_zos_version.go +++ b/registrar-cli/cmd/zos_version_update.go @@ -7,9 +7,9 @@ import ( "github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli/internal/cmd" ) -// UpdateZosVersionCmd represents the update farm command +// UpdateZosVersionCmd represents the zos version update command var UpdateZosVersionCmd = &cobra.Command{ - Use: "version", + Use: "update", Short: "update zos version in node registrar", RunE: func(cobraCmd *cobra.Command, args []string) error { seed, err := cobraCmd.Flags().GetString("seed") @@ -44,7 +44,7 @@ var UpdateZosVersionCmd = &cobra.Command{ } func init() { - updateCmd.AddCommand(UpdateZosVersionCmd) + zosVersionCmd.AddCommand(UpdateZosVersionCmd) UpdateZosVersionCmd.Flags().StringP("seed", "s", "", "account seed key") UpdateZosVersionCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") UpdateZosVersionCmd.Flags().StringP("version", "v", "v0.0.0", "new zos version") From 0e247e71dd6564072e56eedc51ec68b82960fc3b Mon Sep 17 00:00:00 2001 From: Eslam-Nawara Date: Mon, 3 Mar 2025 16:18:27 +0200 Subject: [PATCH 06/17] update registrar cli readme --- registrar-cli/README.md | 118 +++++++++++++++++++++------------------- 1 file changed, 61 insertions(+), 57 deletions(-) diff --git a/registrar-cli/README.md b/registrar-cli/README.md index 9fa7fe8..301d720 100644 --- a/registrar-cli/README.md +++ b/registrar-cli/README.md @@ -26,9 +26,9 @@ This tool allows users to create/get/update farm/account/node on a specified ne ## Usage -## Create Command +## Account Command -Create command allows users to create an account or a farm +Account command represents events on account on Threefold grid4 ### Create New Account @@ -42,136 +42,140 @@ Create command allows users to create an account or a farm **Example Usage**: ```sh -➜ registrar-cli git:(add-registrar-cli-tool) ✗ ./registrar-cli create account --network dev +➜ registrar-cli git:(add-registrar-cli-tool) ✗ ./registrar-cli account create --network dev 5:00PM INF New Seed (Hex): 7f40eb52530f1a1c1253873cf17d44bd66d3e5ba71a14d0deba7df5517c9ed12 5:00PM INF public key (Hex): c394d84de07fac2b2477588dace29a165a469fe0a9dbc8056686d3340054bf9d 5:00PM INF account is created successfully twinID=33 ``` -### Create New Farm +### Get Account **Flags**: -- `--farm_name` (required): The name of the farm to create. - `--network` (required): Specifies the network (`dev`, `qa`, `test`, `main`). -- `--seed` (required): A hexadecimal representation of the seed. -- `--dedicated` (optional default: false): is the farm dedicated. +- `--twin-id` (optional): twin id of the account needed to be loaded. +- `--public-key` (optional): public key of the account needed to be loaded. **Example Usage**: ```sh -➜ registrar-cli git:(add-registrar-cli-tool) ✗ ./registrar-cli create farm --farm-name testFarm1 --seed --network dev -5:03PM INF farm is created successfully farmID=12 +➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go account get --network dev --twin-id 33 +5:00PM INF account={"public_key":"w5TYTeB/rCskd1iNrOKaFlpGn+Cp28gFZobTNABUv50=","relays":[],"rmb_enc_key":"","twin_id":33} +➜ +➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go account get --network dev --public-key +5:01PM INF account={"public_key":"w5TYTeB/rCskd1iNrOKaFlpGn+Cp28gFZobTNABUv50=","relays":[],"rmb_enc_key":"","twin_id":33} ``` -## Get Command - -Get command allows users to get account, farm, node or zos version. - -### Get Account +### Update Account **Flags**: - `--network` (required): Specifies the network (`dev`, `qa`, `test`, `main`). -- `--twin-id` (optional): twin id of the account needed to be loaded. -- `--public-key` (optional): public key of the account needed to be loaded. +- `--seed` (required): A hexadecimal representation of the seed. +- `--relays` (optional): new relays urls. +- `--rmb-enc-key` (optional): new rmb encryption key. **Example Usage**: ```sh -➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go get account --network dev --twin-id 33 -5:00PM INF account={"public_key":"w5TYTeB/rCskd1iNrOKaFlpGn+Cp28gFZobTNABUv50=","relays":[],"rmb_enc_key":"","twin_id":33} +➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go account update --network dev --seed --relays wss://relay.dev.grid.tf +5:02PM INF account is updated successfully ➜ -➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go get account --network dev --public-key -5:01PM INF account={"public_key":"w5TYTeB/rCskd1iNrOKaFlpGn+Cp28gFZobTNABUv50=","relays":[],"rmb_enc_key":"","twin_id":33} +➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go account get --network dev --twin-id 33 +5:02PM INF account={"public_key":"w5TYTeB/rCskd1iNrOKaFlpGn+Cp28gFZobTNABUv50=","relays":["wss://relay.dev.grid.tf"],"rmb_enc_key":"","twin_id":33} ``` -### Get Farm +## Farm Command + +Farm command represents events on farms on Threefold grid4 + +### Create New Farm **Flags**: +- `--farm_name` (required): The name of the farm to create. - `--network` (required): Specifies the network (`dev`, `qa`, `test`, `main`). -- `--farm-id` (optional): id of the farm needed to be loaded. +- `--seed` (required): A hexadecimal representation of the seed. +- `--dedicated` (optional default: false): is the farm dedicated. **Example Usage**: ```sh -➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go get farm --farm-id 12 --network dev -5:03PM INF farm={"dedicated":false,"farm_id":12,"farm_name":"testFarm1","twin_id":33} +➜ registrar-cli git:(add-registrar-cli-tool) ✗ ./registrar-cli farm create --farm-name testFarm1 --seed --network dev +5:03PM INF farm is created successfully farmID=12 ``` -### Get Node +### Get Farm **Flags**: - `--network` (required): Specifies the network (`dev`, `qa`, `test`, `main`). -- `--node-id` (optional): id of the node needed to be loaded. -- `--twin-id` (optional): twin id of the node needed to be loaded. +- `--farm-id` (optional): id of the farm needed to be loaded. **Example Usage**: ```sh -➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go get node --network dev --node-id 1 -12:36PM INF node={"Approved":false,"farm_id":4,"interfaces":[{"ips":"192.168.123.22","mac":"54:fe:9a:b0:73:61","name":"zos"}],"location":{"city":"Cairo","country":"Egypt","latitude":"30.0588","longitude":"31.2268"},"node_id":1,"resources":{"cru":4,"hru":1073741824000,"mru":6230032384,"sru":1610612736000},"secure_boot":false,"serial_number":"Not Specified","twin_id":5,"uptime":null,"virtualized":true} -➜ -➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go get node --network dev --twin-id 5 -12:36PM INF node={"Approved":false,"farm_id":4,"interfaces":[{"ips":"192.168.123.22","mac":"54:fe:9a:b0:73:61","name":"zos"}],"location":{"city":"Cairo","country":"Egypt","latitude":"30.0588","longitude":"31.2268"},"node_id":1,"resources":{"cru":4,"hru":1073741824000,"mru":6230032384,"sru":1610612736000},"secure_boot":false,"serial_number":"Not Specified","twin_id":5,"uptime":null,"virtualized":true} +➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go farm get --farm-id 12 --network dev +5:03PM INF farm={"dedicated":false,"farm_id":12,"farm_name":"testFarm1","twin_id":33} ``` -### Get Zos Version +### Update Farm **Flags**: - `--network` (required): Specifies the network (`dev`, `qa`, `test`, `main`). +- `--seed` (required): A hexadecimal representation of the seed. +- `--farm-id` (optional): id of the farm needed to be loaded. +- `--farm_name` (optional): The new name of the farm. +- `--dedicated` (optional): update the farm to dedicated. **Example Usage**: ```sh -➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go get version --network dev -12:40PM INF zosVersion={"safe_to_upgrade":true,"version":"v0.1.8"} +➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go farm update --farm-name notTestFarm1 --seed --network dev --farm-id 12 +5:04PM INF farm is updated successfully +➜ +➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go farm get --farm-id 12 --network dev +5:04PM INF farm={"dedicated":false,"farm_id":12,"farm_name":"notTestFarm1","twin_id":33} ``` -## Update Command +## Node Command -Update command allows users to update account, farm or zos version. +Node command represents events on nodes on Threefold grid4 -### Update Account +### Get Node **Flags**: - `--network` (required): Specifies the network (`dev`, `qa`, `test`, `main`). -- `--seed` (required): A hexadecimal representation of the seed. -- `--relays` (optional): new relays urls. -- `--rmb-enc-key` (optional): new rmb encryption key. +- `--node-id` (optional): id of the node needed to be loaded. +- `--twin-id` (optional): twin id of the node needed to be loaded. **Example Usage**: ```sh -➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go update account --network dev --seed --relays wss://relay.dev.grid.tf -5:02PM INF account is updated successfully +➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go node get --network dev --node-id 1 +12:36PM INF node={"Approved":false,"farm_id":4,"interfaces":[{"ips":"192.168.123.22","mac":"54:fe:9a:b0:73:61","name":"zos"}],"location":{"city":"Cairo","country":"Egypt","latitude":"30.0588","longitude":"31.2268"},"node_id":1,"resources":{"cru":4,"hru":1073741824000,"mru":6230032384,"sru":1610612736000},"secure_boot":false,"serial_number":"Not Specified","twin_id":5,"uptime":null,"virtualized":true} ➜ -➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go get account --network dev --twin-id 33 -5:02PM INF account={"public_key":"w5TYTeB/rCskd1iNrOKaFlpGn+Cp28gFZobTNABUv50=","relays":["wss://relay.dev.grid.tf"],"rmb_enc_key":"","twin_id":33} +➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go node get --network dev --twin-id 5 +12:36PM INF node={"Approved":false,"farm_id":4,"interfaces":[{"ips":"192.168.123.22","mac":"54:fe:9a:b0:73:61","name":"zos"}],"location":{"city":"Cairo","country":"Egypt","latitude":"30.0588","longitude":"31.2268"},"node_id":1,"resources":{"cru":4,"hru":1073741824000,"mru":6230032384,"sru":1610612736000},"secure_boot":false,"serial_number":"Not Specified","twin_id":5,"uptime":null,"virtualized":true} ``` -### Update Farm +## Zos Version Command + +Zos Version command represents events on zos version on Threefold grid4 + +### Get Zos Version **Flags**: - `--network` (required): Specifies the network (`dev`, `qa`, `test`, `main`). -- `--seed` (required): A hexadecimal representation of the seed. -- `--farm-id` (optional): id of the farm needed to be loaded. -- `--farm_name` (optional): The new name of the farm. -- `--dedicated` (optional): update the farm to dedicated. **Example Usage**: ```sh -➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go update farm --farm-name notTestFarm1 --seed --network dev --farm-id 12 -5:04PM INF farm is updated successfully -➜ -➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go get farm --farm-id 12 --network dev -5:04PM INF farm={"dedicated":false,"farm_id":12,"farm_name":"notTestFarm1","twin_id":33} +➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go zos-version get --network dev +12:40PM INF zosVersion={"safe_to_upgrade":true,"version":"v0.1.8"} ``` ### Update Zos Version @@ -185,9 +189,9 @@ Update command allows users to update account, farm or zos version. **Example Usage**: ```sh -➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go update version --network dev --version v0.1.8 --safe-to-upgrade --seed +➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go zos-version update --network dev --version v0.1.8 --safe-to-upgrade --seed 5:07PM INF farm is updated successfully ➜ -➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go get version --network dev +➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go zos-version get --network dev 5:07PM INF zosVersion={"safe_to_upgrade":true,"version":"v0.1.8"} ``` From fa093f5fd747b96055d9e2d43381c3d42727cef4 Mon Sep 17 00:00:00 2001 From: Eslam-Nawara Date: Mon, 10 Mar 2025 16:20:05 +0200 Subject: [PATCH 07/17] use mnemonic in registrar cli --- registrar-cli/cmd/account_create.go | 7 +- registrar-cli/cmd/account_update.go | 4 +- registrar-cli/cmd/farm_create.go | 12 ++- registrar-cli/cmd/farm_update.go | 12 ++- registrar-cli/cmd/root.go | 7 -- registrar-cli/cmd/zos_version_update.go | 4 +- registrar-cli/internal/cmd/account.go | 82 ++++++++++++++++ registrar-cli/internal/cmd/create.go | 74 --------------- registrar-cli/internal/cmd/farm.go | 69 ++++++++++++++ registrar-cli/internal/cmd/get.go | 111 ---------------------- registrar-cli/internal/cmd/node.go | 36 +++++++ registrar-cli/internal/cmd/update.go | 99 ------------------- registrar-cli/internal/cmd/version.go | 39 ++++++++ registrar-cli/internal/seedgen/seedgen.go | 33 ------- 14 files changed, 252 insertions(+), 337 deletions(-) create mode 100644 registrar-cli/internal/cmd/account.go delete mode 100644 registrar-cli/internal/cmd/create.go create mode 100644 registrar-cli/internal/cmd/farm.go delete mode 100644 registrar-cli/internal/cmd/get.go create mode 100644 registrar-cli/internal/cmd/node.go delete mode 100644 registrar-cli/internal/cmd/update.go create mode 100644 registrar-cli/internal/cmd/version.go delete mode 100644 registrar-cli/internal/seedgen/seedgen.go diff --git a/registrar-cli/cmd/account_create.go b/registrar-cli/cmd/account_create.go index 0943a06..4e56b7c 100644 --- a/registrar-cli/cmd/account_create.go +++ b/registrar-cli/cmd/account_create.go @@ -12,7 +12,7 @@ var accountCreateCmd = &cobra.Command{ Use: "create", Short: "create new account in node registrar", RunE: func(cobraCmd *cobra.Command, args []string) error { - seed, err := cobraCmd.Flags().GetString("seed") + mnemonic, err := cobraCmd.Flags().GetString("menmonic") if err != nil { return err } @@ -32,10 +32,11 @@ var accountCreateCmd = &cobra.Command{ return err } - account, err := cmd.CreaeteAccount(seed, network, relays, rmbEncKey) + account, mnemonic, err := cmd.CreaeteAccount(network, relays, rmbEncKey, mnemonic) if err != nil { return err } + log.Info().Str("mnemonic", mnemonic).Msg("new account is created with mnemonic") log.Info().Uint64("twinID", account.TwinID).Msg("account is created successfully") @@ -45,7 +46,7 @@ var accountCreateCmd = &cobra.Command{ func init() { accountCmd.AddCommand(accountCreateCmd) - accountCreateCmd.Flags().StringP("seed", "s", "", "account seed key") + accountCreateCmd.Flags().StringP("menmonic", "m", "", "account menmonic") accountCreateCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") accountCreateCmd.Flags().StringArrayP("relays", "r", nil, "relays urls") accountCreateCmd.Flags().StringP("rmb-enc-key", "k", "", "rmb encryption key") diff --git a/registrar-cli/cmd/account_update.go b/registrar-cli/cmd/account_update.go index 562d130..569d0d7 100644 --- a/registrar-cli/cmd/account_update.go +++ b/registrar-cli/cmd/account_update.go @@ -12,7 +12,7 @@ var accountUpdateCmd = &cobra.Command{ Use: "update", Short: "update account in node registrar", RunE: func(cobraCmd *cobra.Command, args []string) error { - seed, err := cobraCmd.Flags().GetString("seed") + seed, err := cobraCmd.Flags().GetString("menmonic") if err != nil { return err } @@ -45,7 +45,7 @@ var accountUpdateCmd = &cobra.Command{ func init() { accountCmd.AddCommand(accountUpdateCmd) - accountUpdateCmd.Flags().StringP("seed", "s", "", "account seed key") + accountUpdateCmd.Flags().StringP("menmonic", "m", "", "account menmonic") accountUpdateCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") accountUpdateCmd.Flags().StringArrayP("relays", "r", nil, "relays urls") accountUpdateCmd.Flags().StringP("rmb-enc-key", "k", "", "rmb encryption key") diff --git a/registrar-cli/cmd/farm_create.go b/registrar-cli/cmd/farm_create.go index b8c1cc3..09d6ffe 100644 --- a/registrar-cli/cmd/farm_create.go +++ b/registrar-cli/cmd/farm_create.go @@ -12,7 +12,7 @@ var farmCreateCmd = &cobra.Command{ Use: "create", Short: "create new farm in node registrar", RunE: func(cobraCmd *cobra.Command, args []string) error { - seed, err := cobraCmd.Flags().GetString("seed") + mnemonic, err := cobraCmd.Flags().GetString("menmonic") if err != nil { return err } @@ -27,12 +27,17 @@ var farmCreateCmd = &cobra.Command{ return err } + stellarAddrss, err := cobraCmd.Flags().GetString("stellar-address") + if err != nil { + return err + } + dedicated, err := cobraCmd.Flags().GetBool("dedicated") if err != nil { return err } - farmID, err := cmd.CreaeteFarm(seed, network, farmName, dedicated) + farmID, err := cmd.CreaeteFarm(mnemonic, network, farmName, stellarAddrss, dedicated) if err != nil { return err } @@ -45,8 +50,9 @@ var farmCreateCmd = &cobra.Command{ func init() { farmCmd.AddCommand(farmCreateCmd) - farmCreateCmd.Flags().StringP("seed", "s", "", "account seed key") + farmCreateCmd.Flags().StringP("menmonic", "m", "", "account menmonic") farmCreateCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") farmCreateCmd.Flags().StringP("farm-name", "f", "", "farm name") + farmCreateCmd.Flags().StringP("stellar-address", "s", "", "stellar address") farmCreateCmd.Flags().BoolP("dedicated", "d", false, "is farm dedicated") } diff --git a/registrar-cli/cmd/farm_update.go b/registrar-cli/cmd/farm_update.go index 4286b9a..c63a18c 100644 --- a/registrar-cli/cmd/farm_update.go +++ b/registrar-cli/cmd/farm_update.go @@ -12,7 +12,7 @@ var farmUpdateCmd = &cobra.Command{ Use: "update", Short: "update farm in node registrar", RunE: func(cobraCmd *cobra.Command, args []string) error { - seed, err := cobraCmd.Flags().GetString("seed") + mnemonic, err := cobraCmd.Flags().GetString("menmonic") if err != nil { return err } @@ -32,12 +32,17 @@ var farmUpdateCmd = &cobra.Command{ return err } + stellarAddrss, err := cobraCmd.Flags().GetString("stellar-address") + if err != nil { + return err + } + dedicated, err := cobraCmd.Flags().GetBool("dedicated") if err != nil { return err } - err = cmd.UpdateFarm(seed, network, farmID, farmName, dedicated) + err = cmd.UpdateFarm(farmID, mnemonic, network, farmName, stellarAddrss, dedicated) if err != nil { return err } @@ -50,9 +55,10 @@ var farmUpdateCmd = &cobra.Command{ func init() { farmCmd.AddCommand(farmUpdateCmd) - farmUpdateCmd.Flags().StringP("seed", "s", "", "account seed key") + farmUpdateCmd.Flags().StringP("menmonic", "m", "", "account menmonic") farmUpdateCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") farmUpdateCmd.Flags().Uint64P("farm-id", "i", 0, "farm id") farmUpdateCmd.Flags().String("farm-name", "", "new farm name") + farmUpdateCmd.Flags().StringP("stellar-address", "s", "", "stellar address") farmUpdateCmd.Flags().BoolP("dedicated", "d", false, "farm is dedicated") } diff --git a/registrar-cli/cmd/root.go b/registrar-cli/cmd/root.go index 233bf1e..146eea3 100644 --- a/registrar-cli/cmd/root.go +++ b/registrar-cli/cmd/root.go @@ -11,13 +11,6 @@ import ( "github.com/spf13/cobra" ) -var urls = map[string]string{ - "dev": "https://registrar.dev4.grid.tf/v1", - "qa": "https://registrar.qa4.grid.tf/v1", - "test": "https://registrar.test4.grid.tf/v1", - "main": "https://registrar.prod4.grid.tf/v1", -} - // rootCmd represents the base command when called without any subcommands var rootCmd = &cobra.Command{ Use: "registrar-cli", diff --git a/registrar-cli/cmd/zos_version_update.go b/registrar-cli/cmd/zos_version_update.go index d5adfc8..782a672 100644 --- a/registrar-cli/cmd/zos_version_update.go +++ b/registrar-cli/cmd/zos_version_update.go @@ -12,7 +12,7 @@ var UpdateZosVersionCmd = &cobra.Command{ Use: "update", Short: "update zos version in node registrar", RunE: func(cobraCmd *cobra.Command, args []string) error { - seed, err := cobraCmd.Flags().GetString("seed") + seed, err := cobraCmd.Flags().GetString("menmonic") if err != nil { return err } @@ -45,7 +45,7 @@ var UpdateZosVersionCmd = &cobra.Command{ func init() { zosVersionCmd.AddCommand(UpdateZosVersionCmd) - UpdateZosVersionCmd.Flags().StringP("seed", "s", "", "account seed key") + UpdateZosVersionCmd.Flags().StringP("menmonic", "m", "", "account menmonic") UpdateZosVersionCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") UpdateZosVersionCmd.Flags().StringP("version", "v", "v0.0.0", "new zos version") UpdateZosVersionCmd.Flags().BoolP("safe-to-upgrade", "u", false, "safe to upgrade") diff --git a/registrar-cli/internal/cmd/account.go b/registrar-cli/internal/cmd/account.go new file mode 100644 index 0000000..78a5872 --- /dev/null +++ b/registrar-cli/internal/cmd/account.go @@ -0,0 +1,82 @@ +package cmd + +import ( + "encoding/hex" + "fmt" + + "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" +) + +var urls = map[string]string{ + "dev": "https://registrar.dev4.grid.tf/v1", + "qa": "https://registrar.qa4.grid.tf/v1", + "test": "https://registrar.test4.grid.tf/v1", + "main": "https://registrar.prod4.grid.tf/v1", +} + +func CreaeteAccount(network string, relays []string, rmbEncKey string, mnemonicOrSeed ...string) (account client.Account, mnemonic string, err error) { + u, ok := urls[network] + if !ok { + return account, "", fmt.Errorf("invalid network %s", network) + } + + var cli client.RegistrarClient + cli, err = client.NewRegistrarClient(u, mnemonicOrSeed...) + if err != nil { + return + } + + return cli.CreateAccount(relays, rmbEncKey) +} + +func GetAccount(network string, twinID uint64, pk string) (account client.Account, err error) { + u, ok := urls[network] + if !ok { + return account, fmt.Errorf("invalid network %s", network) + } + + publicKey, err := hex.DecodeString(pk) + if err != nil { + return + } + + cli, err := client.NewRegistrarClient(u) + if err != nil { + return + } + + if twinID != 0 { + return cli.GetAccount(twinID) + } else if len(publicKey) != 0 { + return cli.GetAccountByPK(publicKey) + } + + return account, fmt.Errorf("you need to provide either twin id or public key to load an account") +} + +func UpdateAccount(mnemonic string, network string, relays []string, rmbEncKey string) (err error) { + u, ok := urls[network] + if !ok { + return fmt.Errorf("invalid network %s", network) + } + + if len(mnemonic) == 0 { + return fmt.Errorf("can not initialize registrar client with no mnemonic") + } + + cli, err := client.NewRegistrarClient(u, mnemonic) + if err != nil { + return err + } + + var opts []client.UpdateAccountOpts + if len(relays) > 0 { + opts = append(opts, client.UpdateAccountWithRelays(relays)) + } + + if len(rmbEncKey) > 0 { + opts = append(opts, client.UpdateAccountWithRMBEncKey(rmbEncKey)) + } + + return cli.UpdateAccount(opts...) +} diff --git a/registrar-cli/internal/cmd/create.go b/registrar-cli/internal/cmd/create.go deleted file mode 100644 index a2f4add..0000000 --- a/registrar-cli/internal/cmd/create.go +++ /dev/null @@ -1,74 +0,0 @@ -package cmd - -import ( - "crypto/ed25519" - "encoding/hex" - "fmt" - - "github.com/rs/zerolog/log" - "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" - "github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli/internal/seedgen" -) - -var urls = map[string]string{ - "dev": "https://registrar.dev4.grid.tf/v1", - "qa": "https://registrar.qa4.grid.tf/v1", - "test": "https://registrar.test4.grid.tf/v1", - "main": "https://registrar.prod4.grid.tf/v1", -} - -func CreaeteAccount(seed string, network string, relays []string, rmbEncKey string) (account client.Account, err error) { - u, ok := urls[network] - if !ok { - return account, fmt.Errorf("invalid network %s", network) - } - - if len(seed) == 0 { - seed, err = seedgen.GenerateRandomSeed() - if err != nil { - return - } - log.Info().Msgf("New Seed (Hex): %s", seed) - } - - seedBytes, err := hex.DecodeString(seed) - if err != nil { - return - } - - privateKey := ed25519.NewKeyFromSeed(seedBytes) - publicKey := privateKey.Public().(ed25519.PublicKey) - - log.Info().Msgf("public key (Hex): %s", hex.EncodeToString(publicKey)) - - cli, err := client.NewRegistrarClient(u, privateKey) - if err != nil { - return - } - - return cli.CreateAccount(relays, rmbEncKey) -} - -func CreaeteFarm(seed string, network string, farmName string, dedicated bool) (farmID uint64, err error) { - u, ok := urls[network] - if !ok { - return farmID, fmt.Errorf("invalid network %s", network) - } - - if len(seed) == 0 { - return farmID, fmt.Errorf("can not initialize registrar client with no seed") - } - - seedBytes, err := hex.DecodeString(seed) - if err != nil { - return - } - - privateKey := ed25519.NewKeyFromSeed(seedBytes) - cli, err := client.NewRegistrarClient(u, privateKey) - if err != nil { - return - } - - return cli.CreateFarm(farmName, dedicated) -} diff --git a/registrar-cli/internal/cmd/farm.go b/registrar-cli/internal/cmd/farm.go new file mode 100644 index 0000000..5816573 --- /dev/null +++ b/registrar-cli/internal/cmd/farm.go @@ -0,0 +1,69 @@ +package cmd + +import ( + "fmt" + + "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" +) + +func CreaeteFarm(mnemonic, network, farmName, stellarAddress string, dedicated bool) (farmID uint64, err error) { + u, ok := urls[network] + if !ok { + return farmID, fmt.Errorf("invalid network %s", network) + } + + if len(mnemonic) == 0 { + return farmID, fmt.Errorf("can not initialize registrar client with no seed") + } + + cli, err := client.NewRegistrarClient(u, mnemonic) + if err != nil { + return + } + + return cli.CreateFarm(farmName, stellarAddress, dedicated) +} + +func GetFarm(network string, farmID uint64) (farm client.Farm, err error) { + u, ok := urls[network] + if !ok { + return farm, fmt.Errorf("invalid network %s", network) + } + + cli, err := client.NewRegistrarClient(u) + if err != nil { + return + } + + return cli.GetFarm(farmID) +} + +func UpdateFarm(farmID uint64, mnemonic, network, farmName, stellarAddress string, dedicated bool) (err error) { + u, ok := urls[network] + if !ok { + return fmt.Errorf("invalid network %s", network) + } + + if len(mnemonic) == 0 { + return fmt.Errorf("can not initialize registrar client with no mnemonic") + } + + cli, err := client.NewRegistrarClient(u, mnemonic) + if err != nil { + return err + } + + var opts []client.UpdateFarmOpts + if len(farmName) > 0 { + opts = append(opts, client.UpdateFarmWithName(farmName)) + } + + if dedicated { + opts = append(opts, client.UpdateFarmWithDedicated()) + } + if len(stellarAddress) != 0 { + // opts = append(opts, client.Updfarm) + } + + return cli.UpdateFarm(farmID, opts...) +} diff --git a/registrar-cli/internal/cmd/get.go b/registrar-cli/internal/cmd/get.go deleted file mode 100644 index 912cd04..0000000 --- a/registrar-cli/internal/cmd/get.go +++ /dev/null @@ -1,111 +0,0 @@ -package cmd - -import ( - "encoding/hex" - "fmt" - - "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" - "github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli/internal/seedgen" -) - -func GetAccount(network string, twinID uint64, pk string) (account client.Account, err error) { - u, ok := urls[network] - if !ok { - return account, fmt.Errorf("invalid network %s", network) - } - - privateKey, err := seedgen.GenerateRandomKey() - if err != nil { - return - } - - publicKey, err := hex.DecodeString(pk) - if err != nil { - return - } - - cli, err := client.NewRegistrarClient(u, privateKey) - if err != nil { - return - } - - if twinID != 0 { - return cli.GetAccount(twinID) - } else if len(publicKey) != 0 { - return cli.GetAccountByPK(publicKey) - } - - return account, fmt.Errorf("you need to provide either twin id or public key to load an account") -} - -func GetFarm(network string, farmID uint64) (farm client.Farm, err error) { - u, ok := urls[network] - if !ok { - return farm, fmt.Errorf("invalid network %s", network) - } - - privateKey, err := seedgen.GenerateRandomKey() - if err != nil { - return - } - - cli, err := client.NewRegistrarClient(u, privateKey) - if err != nil { - return - } - - return cli.GetFarm(farmID) -} - -func GetNode(network string, nodeID, twinID uint64) (node client.Node, err error) { - u, ok := urls[network] - if !ok { - return node, fmt.Errorf("invalid network %s", network) - } - - privateKey, err := seedgen.GenerateRandomKey() - if err != nil { - return - } - - cli, err := client.NewRegistrarClient(u, privateKey) - if err != nil { - return - } - - if nodeID != 0 { - node, err = cli.GetNode(nodeID) - if err != nil { - return - } - - } else if twinID != 0 { - node, err = cli.GetNodeByTwinID(twinID) - if err != nil { - return - } - } else { - return node, fmt.Errorf("you need to provide either twin id or node id to load a node") - } - - return -} - -func GetVersion(network string) (version client.ZosVersion, err error) { - u, ok := urls[network] - if !ok { - return version, fmt.Errorf("invalid network %s", network) - } - - privateKey, err := seedgen.GenerateRandomKey() - if err != nil { - return - } - - cli, err := client.NewRegistrarClient(u, privateKey) - if err != nil { - return - } - - return cli.GetZosVersion() -} diff --git a/registrar-cli/internal/cmd/node.go b/registrar-cli/internal/cmd/node.go new file mode 100644 index 0000000..d132822 --- /dev/null +++ b/registrar-cli/internal/cmd/node.go @@ -0,0 +1,36 @@ +package cmd + +import ( + "fmt" + + "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" +) + +func GetNode(network string, nodeID, twinID uint64) (node client.Node, err error) { + u, ok := urls[network] + if !ok { + return node, fmt.Errorf("invalid network %s", network) + } + + cli, err := client.NewRegistrarClient(u) + if err != nil { + return + } + + if nodeID != 0 { + node, err = cli.GetNode(nodeID) + if err != nil { + return + } + + } else if twinID != 0 { + node, err = cli.GetNodeByTwinID(twinID) + if err != nil { + return + } + } else { + return node, fmt.Errorf("you need to provide either twin id or node id to load a node") + } + + return +} diff --git a/registrar-cli/internal/cmd/update.go b/registrar-cli/internal/cmd/update.go deleted file mode 100644 index 03b2ca8..0000000 --- a/registrar-cli/internal/cmd/update.go +++ /dev/null @@ -1,99 +0,0 @@ -package cmd - -import ( - "crypto/ed25519" - "encoding/hex" - "fmt" - - "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" -) - -func UpdateAccount(seed string, network string, relays []string, rmbEncKey string) (err error) { - u, ok := urls[network] - if !ok { - return fmt.Errorf("invalid network %s", network) - } - - if len(seed) == 0 { - return fmt.Errorf("can not initialize registrar client with no seed") - } - - seedBytes, err := hex.DecodeString(seed) - if err != nil { - return err - } - - privateKey := ed25519.NewKeyFromSeed(seedBytes) - cli, err := client.NewRegistrarClient(u, privateKey) - if err != nil { - return err - } - - var opts []client.UpdateAccountOpts - if len(relays) > 0 { - opts = append(opts, client.UpdateAccountWithRelays(relays)) - } - - if len(rmbEncKey) > 0 { - opts = append(opts, client.UpdateAccountWithRMBEncKey(rmbEncKey)) - } - - return cli.UpdateAccount(opts...) -} - -func UpdateFarm(seed string, network string, farmID uint64, farmName string, dedicated bool) (err error) { - u, ok := urls[network] - if !ok { - return fmt.Errorf("invalid network %s", network) - } - - if len(seed) == 0 { - return fmt.Errorf("can not initialize registrar client with no seed") - } - - seedBytes, err := hex.DecodeString(seed) - if err != nil { - return err - } - - privateKey := ed25519.NewKeyFromSeed(seedBytes) - cli, err := client.NewRegistrarClient(u, privateKey) - if err != nil { - return err - } - - var opts []client.UpdateFarmOpts - if len(farmName) > 0 { - opts = append(opts, client.UpdateFarmWithName(farmName)) - } - - if dedicated { - opts = append(opts, client.UpdateFarmWithDedicated()) - } - - return cli.UpdateFarm(farmID, opts...) -} - -func UpdateVersion(seed string, network string, version string, safeToUpgrade bool) (err error) { - u, ok := urls[network] - if !ok { - return fmt.Errorf("invalid network %s", network) - } - - if len(seed) == 0 { - return fmt.Errorf("can not initialize registrar client with no seed") - } - - seedBytes, err := hex.DecodeString(seed) - if err != nil { - return err - } - - privateKey := ed25519.NewKeyFromSeed(seedBytes) - cli, err := client.NewRegistrarClient(u, privateKey) - if err != nil { - return err - } - - return cli.SetZosVersion(version, safeToUpgrade) -} diff --git a/registrar-cli/internal/cmd/version.go b/registrar-cli/internal/cmd/version.go new file mode 100644 index 0000000..c409d42 --- /dev/null +++ b/registrar-cli/internal/cmd/version.go @@ -0,0 +1,39 @@ +package cmd + +import ( + "fmt" + + "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" +) + +func GetVersion(network string) (version client.ZosVersion, err error) { + u, ok := urls[network] + if !ok { + return version, fmt.Errorf("invalid network %s", network) + } + + cli, err := client.NewRegistrarClient(u) + if err != nil { + return + } + + return cli.GetZosVersion() +} + +func UpdateVersion(mnemonic string, network string, version string, safeToUpgrade bool) (err error) { + u, ok := urls[network] + if !ok { + return fmt.Errorf("invalid network %s", network) + } + + if len(mnemonic) == 0 { + return fmt.Errorf("can not initialize registrar client with no mnemonic") + } + + cli, err := client.NewRegistrarClient(u, mnemonic) + if err != nil { + return err + } + + return cli.SetZosVersion(version, safeToUpgrade) +} diff --git a/registrar-cli/internal/seedgen/seedgen.go b/registrar-cli/internal/seedgen/seedgen.go deleted file mode 100644 index 27bed1a..0000000 --- a/registrar-cli/internal/seedgen/seedgen.go +++ /dev/null @@ -1,33 +0,0 @@ -package seedgen - -import ( - "crypto/ed25519" - "crypto/rand" - "encoding/hex" -) - -func GenerateRandomSeed() (string, error) { - s := make([]byte, 32) - _, err := rand.Read(s) - if err != nil { - return "", err - } - - seed := hex.EncodeToString(s) - return seed, nil -} - -func GenerateRandomKey() ([]byte, error) { - seed, err := GenerateRandomSeed() - if err != nil { - return nil, err - } - - seedBytes, err := hex.DecodeString(seed) - if err != nil { - return nil, err - } - - privateKey := ed25519.NewKeyFromSeed(seedBytes) - return privateKey, nil -} From 83a7a6bedc7fbe61598ce7c1c1870fc7ec47f6f3 Mon Sep 17 00:00:00 2001 From: Eslam-Nawara Date: Tue, 11 Mar 2025 13:16:39 +0200 Subject: [PATCH 08/17] fix mnemonic spelling --- registrar-cli/README.md | 23 +++++++++++------------ registrar-cli/cmd/account_create.go | 4 ++-- registrar-cli/cmd/account_update.go | 6 +++--- registrar-cli/cmd/farm_create.go | 4 ++-- registrar-cli/cmd/farm_update.go | 4 ++-- registrar-cli/cmd/zos_version_update.go | 6 +++--- registrar-cli/internal/cmd/farm.go | 2 +- 7 files changed, 24 insertions(+), 25 deletions(-) diff --git a/registrar-cli/README.md b/registrar-cli/README.md index 301d720..5cb1825 100644 --- a/registrar-cli/README.md +++ b/registrar-cli/README.md @@ -35,17 +35,16 @@ Account command represents events on account on Threefold grid4 **Flags**: - `--network` (required): Specifies the network (`dev`, `qa`, `test`, `main`). -- `--seed` (optional): create an account of a seed. +- `--mnemonic` (optional): create an account of a mnemonic. - `--relays` (optional): relays urls. - `--rmb-enc-key` (optional): rmb encryption key. **Example Usage**: ```sh -➜ registrar-cli git:(add-registrar-cli-tool) ✗ ./registrar-cli account create --network dev -5:00PM INF New Seed (Hex): 7f40eb52530f1a1c1253873cf17d44bd66d3e5ba71a14d0deba7df5517c9ed12 -5:00PM INF public key (Hex): c394d84de07fac2b2477588dace29a165a469fe0a9dbc8056686d3340054bf9d -5:00PM INF account is created successfully twinID=33 +➜ registrar-cli git:(add-registrar-cli-tool) ✗ ./registrar-cli account create --network local +1:07PM INF new account is created with mnemonic mnemonic="pyramid cattle mutual brush green east slam lava source stereo rigid able" +1:07PM INF account is created successfully twinID=4 ``` ### Get Account @@ -71,14 +70,14 @@ Account command represents events on account on Threefold grid4 **Flags**: - `--network` (required): Specifies the network (`dev`, `qa`, `test`, `main`). -- `--seed` (required): A hexadecimal representation of the seed. +- `--mnemonic` (required): Account mnemonic. - `--relays` (optional): new relays urls. - `--rmb-enc-key` (optional): new rmb encryption key. **Example Usage**: ```sh -➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go account update --network dev --seed --relays wss://relay.dev.grid.tf +➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go account update --network dev --mnemonic --relays wss://relay.dev.grid.tf 5:02PM INF account is updated successfully ➜ ➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go account get --network dev --twin-id 33 @@ -95,13 +94,13 @@ Farm command represents events on farms on Threefold grid4 - `--farm_name` (required): The name of the farm to create. - `--network` (required): Specifies the network (`dev`, `qa`, `test`, `main`). -- `--seed` (required): A hexadecimal representation of the seed. +- `--mnemonic` (required): Account mnemonic. - `--dedicated` (optional default: false): is the farm dedicated. **Example Usage**: ```sh -➜ registrar-cli git:(add-registrar-cli-tool) ✗ ./registrar-cli farm create --farm-name testFarm1 --seed --network dev +➜ registrar-cli git:(add-registrar-cli-tool) ✗ ./registrar-cli farm create --farm-name testFarm1 --mnemonic --network dev 5:03PM INF farm is created successfully farmID=12 ``` @@ -124,7 +123,7 @@ Farm command represents events on farms on Threefold grid4 **Flags**: - `--network` (required): Specifies the network (`dev`, `qa`, `test`, `main`). -- `--seed` (required): A hexadecimal representation of the seed. +- `--mnemonic` (required): Account mnemonic. - `--farm-id` (optional): id of the farm needed to be loaded. - `--farm_name` (optional): The new name of the farm. - `--dedicated` (optional): update the farm to dedicated. @@ -132,7 +131,7 @@ Farm command represents events on farms on Threefold grid4 **Example Usage**: ```sh -➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go farm update --farm-name notTestFarm1 --seed --network dev --farm-id 12 +➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go farm update --farm-name notTestFarm1 --mnemonic --network dev --farm-id 12 5:04PM INF farm is updated successfully ➜ ➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go farm get --farm-id 12 --network dev @@ -189,7 +188,7 @@ Zos Version command represents events on zos version on Threefold grid4 **Example Usage**: ```sh -➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go zos-version update --network dev --version v0.1.8 --safe-to-upgrade --seed +➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go zos-version update --network dev --version v0.1.8 --safe-to-upgrade --mnemonic 5:07PM INF farm is updated successfully ➜ ➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go zos-version get --network dev diff --git a/registrar-cli/cmd/account_create.go b/registrar-cli/cmd/account_create.go index 4e56b7c..2ef66ec 100644 --- a/registrar-cli/cmd/account_create.go +++ b/registrar-cli/cmd/account_create.go @@ -12,7 +12,7 @@ var accountCreateCmd = &cobra.Command{ Use: "create", Short: "create new account in node registrar", RunE: func(cobraCmd *cobra.Command, args []string) error { - mnemonic, err := cobraCmd.Flags().GetString("menmonic") + mnemonic, err := cobraCmd.Flags().GetString("mnemonic") if err != nil { return err } @@ -46,7 +46,7 @@ var accountCreateCmd = &cobra.Command{ func init() { accountCmd.AddCommand(accountCreateCmd) - accountCreateCmd.Flags().StringP("menmonic", "m", "", "account menmonic") + accountCreateCmd.Flags().StringP("mnemonic", "m", "", "account mnemonic") accountCreateCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") accountCreateCmd.Flags().StringArrayP("relays", "r", nil, "relays urls") accountCreateCmd.Flags().StringP("rmb-enc-key", "k", "", "rmb encryption key") diff --git a/registrar-cli/cmd/account_update.go b/registrar-cli/cmd/account_update.go index 569d0d7..43dbfc1 100644 --- a/registrar-cli/cmd/account_update.go +++ b/registrar-cli/cmd/account_update.go @@ -12,7 +12,7 @@ var accountUpdateCmd = &cobra.Command{ Use: "update", Short: "update account in node registrar", RunE: func(cobraCmd *cobra.Command, args []string) error { - seed, err := cobraCmd.Flags().GetString("menmonic") + mnemonic, err := cobraCmd.Flags().GetString("mnemonic") if err != nil { return err } @@ -32,7 +32,7 @@ var accountUpdateCmd = &cobra.Command{ return err } - err = cmd.UpdateAccount(seed, network, relays, rmbEncKey) + err = cmd.UpdateAccount(mnemonic, network, relays, rmbEncKey) if err != nil { return err } @@ -45,7 +45,7 @@ var accountUpdateCmd = &cobra.Command{ func init() { accountCmd.AddCommand(accountUpdateCmd) - accountUpdateCmd.Flags().StringP("menmonic", "m", "", "account menmonic") + accountUpdateCmd.Flags().StringP("mnemonic", "m", "", "account mnemonic") accountUpdateCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") accountUpdateCmd.Flags().StringArrayP("relays", "r", nil, "relays urls") accountUpdateCmd.Flags().StringP("rmb-enc-key", "k", "", "rmb encryption key") diff --git a/registrar-cli/cmd/farm_create.go b/registrar-cli/cmd/farm_create.go index 09d6ffe..4caa067 100644 --- a/registrar-cli/cmd/farm_create.go +++ b/registrar-cli/cmd/farm_create.go @@ -12,7 +12,7 @@ var farmCreateCmd = &cobra.Command{ Use: "create", Short: "create new farm in node registrar", RunE: func(cobraCmd *cobra.Command, args []string) error { - mnemonic, err := cobraCmd.Flags().GetString("menmonic") + mnemonic, err := cobraCmd.Flags().GetString("mnemonic") if err != nil { return err } @@ -50,7 +50,7 @@ var farmCreateCmd = &cobra.Command{ func init() { farmCmd.AddCommand(farmCreateCmd) - farmCreateCmd.Flags().StringP("menmonic", "m", "", "account menmonic") + farmCreateCmd.Flags().StringP("mnemonic", "m", "", "account mnemonic") farmCreateCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") farmCreateCmd.Flags().StringP("farm-name", "f", "", "farm name") farmCreateCmd.Flags().StringP("stellar-address", "s", "", "stellar address") diff --git a/registrar-cli/cmd/farm_update.go b/registrar-cli/cmd/farm_update.go index c63a18c..d539068 100644 --- a/registrar-cli/cmd/farm_update.go +++ b/registrar-cli/cmd/farm_update.go @@ -12,7 +12,7 @@ var farmUpdateCmd = &cobra.Command{ Use: "update", Short: "update farm in node registrar", RunE: func(cobraCmd *cobra.Command, args []string) error { - mnemonic, err := cobraCmd.Flags().GetString("menmonic") + mnemonic, err := cobraCmd.Flags().GetString("mnemonic") if err != nil { return err } @@ -55,7 +55,7 @@ var farmUpdateCmd = &cobra.Command{ func init() { farmCmd.AddCommand(farmUpdateCmd) - farmUpdateCmd.Flags().StringP("menmonic", "m", "", "account menmonic") + farmUpdateCmd.Flags().StringP("mnemonic", "m", "", "account mnemonic") farmUpdateCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") farmUpdateCmd.Flags().Uint64P("farm-id", "i", 0, "farm id") farmUpdateCmd.Flags().String("farm-name", "", "new farm name") diff --git a/registrar-cli/cmd/zos_version_update.go b/registrar-cli/cmd/zos_version_update.go index 782a672..712164f 100644 --- a/registrar-cli/cmd/zos_version_update.go +++ b/registrar-cli/cmd/zos_version_update.go @@ -12,7 +12,7 @@ var UpdateZosVersionCmd = &cobra.Command{ Use: "update", Short: "update zos version in node registrar", RunE: func(cobraCmd *cobra.Command, args []string) error { - seed, err := cobraCmd.Flags().GetString("menmonic") + mnemonic, err := cobraCmd.Flags().GetString("mnemonic") if err != nil { return err } @@ -32,7 +32,7 @@ var UpdateZosVersionCmd = &cobra.Command{ return err } - err = cmd.UpdateVersion(seed, network, version, safeToUpgrade) + err = cmd.UpdateVersion(mnemonic, network, version, safeToUpgrade) if err != nil { return err } @@ -45,7 +45,7 @@ var UpdateZosVersionCmd = &cobra.Command{ func init() { zosVersionCmd.AddCommand(UpdateZosVersionCmd) - UpdateZosVersionCmd.Flags().StringP("menmonic", "m", "", "account menmonic") + UpdateZosVersionCmd.Flags().StringP("mnemonic", "m", "", "account mnemonic") UpdateZosVersionCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") UpdateZosVersionCmd.Flags().StringP("version", "v", "v0.0.0", "new zos version") UpdateZosVersionCmd.Flags().BoolP("safe-to-upgrade", "u", false, "safe to upgrade") diff --git a/registrar-cli/internal/cmd/farm.go b/registrar-cli/internal/cmd/farm.go index 5816573..10d7ca6 100644 --- a/registrar-cli/internal/cmd/farm.go +++ b/registrar-cli/internal/cmd/farm.go @@ -13,7 +13,7 @@ func CreaeteFarm(mnemonic, network, farmName, stellarAddress string, dedicated b } if len(mnemonic) == 0 { - return farmID, fmt.Errorf("can not initialize registrar client with no seed") + return farmID, fmt.Errorf("can not initialize registrar client with no mnemonic") } cli, err := client.NewRegistrarClient(u, mnemonic) From f95c5de52aa1090e2840a82deeb42e5577ba219c Mon Sep 17 00:00:00 2001 From: Eslam-Nawara Date: Sun, 23 Mar 2025 12:38:59 +0200 Subject: [PATCH 09/17] fix create typo --- registrar-cli/cmd/account_create.go | 2 +- registrar-cli/cmd/farm_create.go | 2 +- registrar-cli/internal/cmd/account.go | 2 +- registrar-cli/internal/cmd/farm.go | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/registrar-cli/cmd/account_create.go b/registrar-cli/cmd/account_create.go index 2ef66ec..b6addeb 100644 --- a/registrar-cli/cmd/account_create.go +++ b/registrar-cli/cmd/account_create.go @@ -32,7 +32,7 @@ var accountCreateCmd = &cobra.Command{ return err } - account, mnemonic, err := cmd.CreaeteAccount(network, relays, rmbEncKey, mnemonic) + account, mnemonic, err := cmd.CreateAccount(network, relays, rmbEncKey, mnemonic) if err != nil { return err } diff --git a/registrar-cli/cmd/farm_create.go b/registrar-cli/cmd/farm_create.go index 4caa067..74635ad 100644 --- a/registrar-cli/cmd/farm_create.go +++ b/registrar-cli/cmd/farm_create.go @@ -37,7 +37,7 @@ var farmCreateCmd = &cobra.Command{ return err } - farmID, err := cmd.CreaeteFarm(mnemonic, network, farmName, stellarAddrss, dedicated) + farmID, err := cmd.CreateFarm(mnemonic, network, farmName, stellarAddrss, dedicated) if err != nil { return err } diff --git a/registrar-cli/internal/cmd/account.go b/registrar-cli/internal/cmd/account.go index 78a5872..818333f 100644 --- a/registrar-cli/internal/cmd/account.go +++ b/registrar-cli/internal/cmd/account.go @@ -14,7 +14,7 @@ var urls = map[string]string{ "main": "https://registrar.prod4.grid.tf/v1", } -func CreaeteAccount(network string, relays []string, rmbEncKey string, mnemonicOrSeed ...string) (account client.Account, mnemonic string, err error) { +func CreateAccount(network string, relays []string, rmbEncKey string, mnemonicOrSeed ...string) (account client.Account, mnemonic string, err error) { u, ok := urls[network] if !ok { return account, "", fmt.Errorf("invalid network %s", network) diff --git a/registrar-cli/internal/cmd/farm.go b/registrar-cli/internal/cmd/farm.go index 10d7ca6..96c6288 100644 --- a/registrar-cli/internal/cmd/farm.go +++ b/registrar-cli/internal/cmd/farm.go @@ -6,7 +6,7 @@ import ( "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" ) -func CreaeteFarm(mnemonic, network, farmName, stellarAddress string, dedicated bool) (farmID uint64, err error) { +func CreateFarm(mnemonic, network, farmName, stellarAddress string, dedicated bool) (farmID uint64, err error) { u, ok := urls[network] if !ok { return farmID, fmt.Errorf("invalid network %s", network) From 8e046d4fe9b66a851210c68679a8761c435d8926 Mon Sep 17 00:00:00 2001 From: Eslam-Nawara Date: Sun, 23 Mar 2025 12:54:43 +0200 Subject: [PATCH 10/17] remove extra shell prompt --- registrar-cli/README.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/registrar-cli/README.md b/registrar-cli/README.md index 5cb1825..c7d367a 100644 --- a/registrar-cli/README.md +++ b/registrar-cli/README.md @@ -42,7 +42,7 @@ Account command represents events on account on Threefold grid4 **Example Usage**: ```sh -➜ registrar-cli git:(add-registrar-cli-tool) ✗ ./registrar-cli account create --network local +➜ ./registrar-cli account create --network local 1:07PM INF new account is created with mnemonic mnemonic="pyramid cattle mutual brush green east slam lava source stereo rigid able" 1:07PM INF account is created successfully twinID=4 ``` @@ -58,10 +58,10 @@ Account command represents events on account on Threefold grid4 **Example Usage**: ```sh -➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go account get --network dev --twin-id 33 +➜ ./registrar-cli account get --network dev --twin-id 33 5:00PM INF account={"public_key":"w5TYTeB/rCskd1iNrOKaFlpGn+Cp28gFZobTNABUv50=","relays":[],"rmb_enc_key":"","twin_id":33} ➜ -➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go account get --network dev --public-key +➜ ./registrar-cli account get --network dev --public-key 5:01PM INF account={"public_key":"w5TYTeB/rCskd1iNrOKaFlpGn+Cp28gFZobTNABUv50=","relays":[],"rmb_enc_key":"","twin_id":33} ``` @@ -77,10 +77,10 @@ Account command represents events on account on Threefold grid4 **Example Usage**: ```sh -➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go account update --network dev --mnemonic --relays wss://relay.dev.grid.tf +➜ ./registrar-cli account update --network dev --mnemonic --relays wss://relay.dev.grid.tf 5:02PM INF account is updated successfully ➜ -➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go account get --network dev --twin-id 33 +➜ ./registrar-cli account get --network dev --twin-id 33 5:02PM INF account={"public_key":"w5TYTeB/rCskd1iNrOKaFlpGn+Cp28gFZobTNABUv50=","relays":["wss://relay.dev.grid.tf"],"rmb_enc_key":"","twin_id":33} ``` @@ -100,7 +100,7 @@ Farm command represents events on farms on Threefold grid4 **Example Usage**: ```sh -➜ registrar-cli git:(add-registrar-cli-tool) ✗ ./registrar-cli farm create --farm-name testFarm1 --mnemonic --network dev +➜ ./registrar-cli farm create --farm-name testFarm1 --mnemonic --network dev 5:03PM INF farm is created successfully farmID=12 ``` @@ -114,7 +114,7 @@ Farm command represents events on farms on Threefold grid4 **Example Usage**: ```sh -➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go farm get --farm-id 12 --network dev +➜ ./registrar-cli farm get --farm-id 12 --network dev 5:03PM INF farm={"dedicated":false,"farm_id":12,"farm_name":"testFarm1","twin_id":33} ``` @@ -131,10 +131,10 @@ Farm command represents events on farms on Threefold grid4 **Example Usage**: ```sh -➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go farm update --farm-name notTestFarm1 --mnemonic --network dev --farm-id 12 +➜ ./registrar-cli farm update --farm-name notTestFarm1 --mnemonic --network dev --farm-id 12 5:04PM INF farm is updated successfully ➜ -➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go farm get --farm-id 12 --network dev +➜ ./registrar-cli farm get --farm-id 12 --network dev 5:04PM INF farm={"dedicated":false,"farm_id":12,"farm_name":"notTestFarm1","twin_id":33} ``` @@ -153,10 +153,10 @@ Node command represents events on nodes on Threefold grid4 **Example Usage**: ```sh -➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go node get --network dev --node-id 1 +➜ ./registrar-cli node get --network dev --node-id 1 12:36PM INF node={"Approved":false,"farm_id":4,"interfaces":[{"ips":"192.168.123.22","mac":"54:fe:9a:b0:73:61","name":"zos"}],"location":{"city":"Cairo","country":"Egypt","latitude":"30.0588","longitude":"31.2268"},"node_id":1,"resources":{"cru":4,"hru":1073741824000,"mru":6230032384,"sru":1610612736000},"secure_boot":false,"serial_number":"Not Specified","twin_id":5,"uptime":null,"virtualized":true} ➜ -➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go node get --network dev --twin-id 5 +➜ ./registrar-cli node get --network dev --twin-id 5 12:36PM INF node={"Approved":false,"farm_id":4,"interfaces":[{"ips":"192.168.123.22","mac":"54:fe:9a:b0:73:61","name":"zos"}],"location":{"city":"Cairo","country":"Egypt","latitude":"30.0588","longitude":"31.2268"},"node_id":1,"resources":{"cru":4,"hru":1073741824000,"mru":6230032384,"sru":1610612736000},"secure_boot":false,"serial_number":"Not Specified","twin_id":5,"uptime":null,"virtualized":true} ``` @@ -173,7 +173,7 @@ Zos Version command represents events on zos version on Threefold grid4 **Example Usage**: ```sh -➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go zos-version get --network dev +➜ ./registrar-cli zos-version get --network dev 12:40PM INF zosVersion={"safe_to_upgrade":true,"version":"v0.1.8"} ``` @@ -188,9 +188,9 @@ Zos Version command represents events on zos version on Threefold grid4 **Example Usage**: ```sh -➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go zos-version update --network dev --version v0.1.8 --safe-to-upgrade --mnemonic +➜ ./registrar-cli zos-version update --network dev --version v0.1.8 --safe-to-upgrade --mnemonic 5:07PM INF farm is updated successfully ➜ -➜ registrar-cli git:(add-registrar-cli-tool) ✗ go run main.go zos-version get --network dev +➜ ./registrar-cli zos-version get --network dev 5:07PM INF zosVersion={"safe_to_upgrade":true,"version":"v0.1.8"} ``` From 7937a28d66523da4861d843f2ff0c102904ffdbb Mon Sep 17 00:00:00 2001 From: Eslam-Nawara Date: Sun, 23 Mar 2025 13:12:57 +0200 Subject: [PATCH 11/17] use persistent flag for network and mark required flags as required --- registrar-cli/cmd/account_create.go | 4 +++- registrar-cli/cmd/account_get.go | 1 - registrar-cli/cmd/account_update.go | 4 +++- registrar-cli/cmd/farm_create.go | 4 +++- registrar-cli/cmd/farm_get.go | 1 - registrar-cli/cmd/farm_update.go | 4 +++- registrar-cli/cmd/node_get.go | 1 - registrar-cli/cmd/root.go | 4 ++++ registrar-cli/cmd/zos_version_get.go | 1 - registrar-cli/cmd/zos_version_update.go | 16 +++++++++------- 10 files changed, 25 insertions(+), 15 deletions(-) diff --git a/registrar-cli/cmd/account_create.go b/registrar-cli/cmd/account_create.go index b6addeb..5cb14fb 100644 --- a/registrar-cli/cmd/account_create.go +++ b/registrar-cli/cmd/account_create.go @@ -47,7 +47,9 @@ var accountCreateCmd = &cobra.Command{ func init() { accountCmd.AddCommand(accountCreateCmd) accountCreateCmd.Flags().StringP("mnemonic", "m", "", "account mnemonic") - accountCreateCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") + if err := accountCreateCmd.MarkFlagRequired("mnemonic"); err != nil { + log.Fatal().Err(err).Send() + } accountCreateCmd.Flags().StringArrayP("relays", "r", nil, "relays urls") accountCreateCmd.Flags().StringP("rmb-enc-key", "k", "", "rmb encryption key") } diff --git a/registrar-cli/cmd/account_get.go b/registrar-cli/cmd/account_get.go index 772f130..06edcab 100644 --- a/registrar-cli/cmd/account_get.go +++ b/registrar-cli/cmd/account_get.go @@ -40,7 +40,6 @@ var accountGetCmd = &cobra.Command{ func init() { accountCmd.AddCommand(accountGetCmd) - accountGetCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") accountGetCmd.Flags().Uint64P("twin-id", "i", 0, "twin id") accountGetCmd.Flags().StringP("public-key", "k", "", "account public key") } diff --git a/registrar-cli/cmd/account_update.go b/registrar-cli/cmd/account_update.go index 43dbfc1..1a183e7 100644 --- a/registrar-cli/cmd/account_update.go +++ b/registrar-cli/cmd/account_update.go @@ -46,7 +46,9 @@ var accountUpdateCmd = &cobra.Command{ func init() { accountCmd.AddCommand(accountUpdateCmd) accountUpdateCmd.Flags().StringP("mnemonic", "m", "", "account mnemonic") - accountUpdateCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") + if err := accountUpdateCmd.MarkFlagRequired("mnemonic"); err != nil { + log.Fatal().Err(err).Send() + } accountUpdateCmd.Flags().StringArrayP("relays", "r", nil, "relays urls") accountUpdateCmd.Flags().StringP("rmb-enc-key", "k", "", "rmb encryption key") } diff --git a/registrar-cli/cmd/farm_create.go b/registrar-cli/cmd/farm_create.go index 74635ad..4ccb971 100644 --- a/registrar-cli/cmd/farm_create.go +++ b/registrar-cli/cmd/farm_create.go @@ -51,7 +51,9 @@ var farmCreateCmd = &cobra.Command{ func init() { farmCmd.AddCommand(farmCreateCmd) farmCreateCmd.Flags().StringP("mnemonic", "m", "", "account mnemonic") - farmCreateCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") + if err := farmCreateCmd.MarkFlagRequired("mnemonic"); err != nil { + log.Fatal().Err(err).Send() + } farmCreateCmd.Flags().StringP("farm-name", "f", "", "farm name") farmCreateCmd.Flags().StringP("stellar-address", "s", "", "stellar address") farmCreateCmd.Flags().BoolP("dedicated", "d", false, "is farm dedicated") diff --git a/registrar-cli/cmd/farm_get.go b/registrar-cli/cmd/farm_get.go index 6aa3f80..f6b982a 100644 --- a/registrar-cli/cmd/farm_get.go +++ b/registrar-cli/cmd/farm_get.go @@ -40,6 +40,5 @@ var farmGetCmd = &cobra.Command{ func init() { farmCmd.AddCommand(farmGetCmd) - farmGetCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") farmGetCmd.Flags().Uint64P("farm-id", "i", 0, "farm id") } diff --git a/registrar-cli/cmd/farm_update.go b/registrar-cli/cmd/farm_update.go index d539068..2b5566d 100644 --- a/registrar-cli/cmd/farm_update.go +++ b/registrar-cli/cmd/farm_update.go @@ -56,7 +56,9 @@ var farmUpdateCmd = &cobra.Command{ func init() { farmCmd.AddCommand(farmUpdateCmd) farmUpdateCmd.Flags().StringP("mnemonic", "m", "", "account mnemonic") - farmUpdateCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") + if err := farmUpdateCmd.MarkFlagRequired("mnemonic"); err != nil { + log.Fatal().Err(err).Send() + } farmUpdateCmd.Flags().Uint64P("farm-id", "i", 0, "farm id") farmUpdateCmd.Flags().String("farm-name", "", "new farm name") farmUpdateCmd.Flags().StringP("stellar-address", "s", "", "stellar address") diff --git a/registrar-cli/cmd/node_get.go b/registrar-cli/cmd/node_get.go index d29121b..535790c 100644 --- a/registrar-cli/cmd/node_get.go +++ b/registrar-cli/cmd/node_get.go @@ -40,7 +40,6 @@ var nodeGetCmd = &cobra.Command{ func init() { nodeCmd.AddCommand(nodeGetCmd) - nodeGetCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") nodeGetCmd.Flags().Uint64("node-id", 0, "node id") nodeGetCmd.Flags().Uint64("twin-id", 0, "twin id") } diff --git a/registrar-cli/cmd/root.go b/registrar-cli/cmd/root.go index 146eea3..d24c087 100644 --- a/registrar-cli/cmd/root.go +++ b/registrar-cli/cmd/root.go @@ -29,4 +29,8 @@ func Execute() { func init() { zerolog.SetGlobalLevel(zerolog.InfoLevel) log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr}) + rootCmd.PersistentFlags().StringP("network", "n", "", "network (dev, qa, test, main)") + if err := rootCmd.MarkFlagRequired("network"); err != nil { + log.Fatal().Err(err).Send() + } } diff --git a/registrar-cli/cmd/zos_version_get.go b/registrar-cli/cmd/zos_version_get.go index 1de09a9..5353145 100644 --- a/registrar-cli/cmd/zos_version_get.go +++ b/registrar-cli/cmd/zos_version_get.go @@ -30,5 +30,4 @@ var zosVersionGetCmd = &cobra.Command{ func init() { zosVersionCmd.AddCommand(zosVersionGetCmd) - zosVersionGetCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") } diff --git a/registrar-cli/cmd/zos_version_update.go b/registrar-cli/cmd/zos_version_update.go index 712164f..74adfcf 100644 --- a/registrar-cli/cmd/zos_version_update.go +++ b/registrar-cli/cmd/zos_version_update.go @@ -7,8 +7,8 @@ import ( "github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli/internal/cmd" ) -// UpdateZosVersionCmd represents the zos version update command -var UpdateZosVersionCmd = &cobra.Command{ +// zosVersionUpdateCmd represents the zos version update command +var zosVersionUpdateCmd = &cobra.Command{ Use: "update", Short: "update zos version in node registrar", RunE: func(cobraCmd *cobra.Command, args []string) error { @@ -44,9 +44,11 @@ var UpdateZosVersionCmd = &cobra.Command{ } func init() { - zosVersionCmd.AddCommand(UpdateZosVersionCmd) - UpdateZosVersionCmd.Flags().StringP("mnemonic", "m", "", "account mnemonic") - UpdateZosVersionCmd.Flags().StringP("network", "n", "", "network (dev, qa, test, main)") - UpdateZosVersionCmd.Flags().StringP("version", "v", "v0.0.0", "new zos version") - UpdateZosVersionCmd.Flags().BoolP("safe-to-upgrade", "u", false, "safe to upgrade") + zosVersionCmd.AddCommand(zosVersionUpdateCmd) + zosVersionUpdateCmd.Flags().StringP("mnemonic", "m", "", "account mnemonic") + if err := zosVersionUpdateCmd.MarkFlagRequired("mnemonic"); err != nil { + log.Fatal().Err(err).Send() + } + zosVersionUpdateCmd.Flags().StringP("version", "v", "v0.0.0", "new zos version") + zosVersionUpdateCmd.Flags().BoolP("safe-to-upgrade", "u", false, "safe to upgrade") } From 3ce0b22463822698ffce51cb4ed7a411c6f9852a Mon Sep 17 00:00:00 2001 From: Eslam-Nawara Date: Sun, 23 Mar 2025 14:44:22 +0200 Subject: [PATCH 12/17] update required flags list --- registrar-cli/cmd/account_create.go | 3 --- registrar-cli/cmd/account_get.go | 1 + registrar-cli/cmd/account_update.go | 1 + registrar-cli/cmd/farm_create.go | 5 ++--- registrar-cli/cmd/farm_get.go | 3 +++ registrar-cli/cmd/farm_update.go | 6 +++--- registrar-cli/cmd/node_get.go | 1 + registrar-cli/cmd/root.go | 3 --- registrar-cli/cmd/zos_version_update.go | 4 +--- registrar-cli/internal/cmd/account.go | 13 +++++++------ 10 files changed, 19 insertions(+), 21 deletions(-) diff --git a/registrar-cli/cmd/account_create.go b/registrar-cli/cmd/account_create.go index 5cb14fb..929589e 100644 --- a/registrar-cli/cmd/account_create.go +++ b/registrar-cli/cmd/account_create.go @@ -47,9 +47,6 @@ var accountCreateCmd = &cobra.Command{ func init() { accountCmd.AddCommand(accountCreateCmd) accountCreateCmd.Flags().StringP("mnemonic", "m", "", "account mnemonic") - if err := accountCreateCmd.MarkFlagRequired("mnemonic"); err != nil { - log.Fatal().Err(err).Send() - } accountCreateCmd.Flags().StringArrayP("relays", "r", nil, "relays urls") accountCreateCmd.Flags().StringP("rmb-enc-key", "k", "", "rmb encryption key") } diff --git a/registrar-cli/cmd/account_get.go b/registrar-cli/cmd/account_get.go index 06edcab..dcc610f 100644 --- a/registrar-cli/cmd/account_get.go +++ b/registrar-cli/cmd/account_get.go @@ -42,4 +42,5 @@ func init() { accountCmd.AddCommand(accountGetCmd) accountGetCmd.Flags().Uint64P("twin-id", "i", 0, "twin id") accountGetCmd.Flags().StringP("public-key", "k", "", "account public key") + accountGetCmd.MarkFlagsOneRequired("twin-id", "public-key") } diff --git a/registrar-cli/cmd/account_update.go b/registrar-cli/cmd/account_update.go index 1a183e7..c82ad0a 100644 --- a/registrar-cli/cmd/account_update.go +++ b/registrar-cli/cmd/account_update.go @@ -51,4 +51,5 @@ func init() { } accountUpdateCmd.Flags().StringArrayP("relays", "r", nil, "relays urls") accountUpdateCmd.Flags().StringP("rmb-enc-key", "k", "", "rmb encryption key") + accountUpdateCmd.MarkFlagsOneRequired("relays", "rmb-enc-key") } diff --git a/registrar-cli/cmd/farm_create.go b/registrar-cli/cmd/farm_create.go index 4ccb971..5ae805b 100644 --- a/registrar-cli/cmd/farm_create.go +++ b/registrar-cli/cmd/farm_create.go @@ -51,10 +51,9 @@ var farmCreateCmd = &cobra.Command{ func init() { farmCmd.AddCommand(farmCreateCmd) farmCreateCmd.Flags().StringP("mnemonic", "m", "", "account mnemonic") - if err := farmCreateCmd.MarkFlagRequired("mnemonic"); err != nil { - log.Fatal().Err(err).Send() - } farmCreateCmd.Flags().StringP("farm-name", "f", "", "farm name") farmCreateCmd.Flags().StringP("stellar-address", "s", "", "stellar address") + farmCreateCmd.MarkFlagsRequiredTogether("mnemonic", "farm-name", "stellar-address") + farmCreateCmd.Flags().BoolP("dedicated", "d", false, "is farm dedicated") } diff --git a/registrar-cli/cmd/farm_get.go b/registrar-cli/cmd/farm_get.go index f6b982a..9d08e21 100644 --- a/registrar-cli/cmd/farm_get.go +++ b/registrar-cli/cmd/farm_get.go @@ -41,4 +41,7 @@ var farmGetCmd = &cobra.Command{ func init() { farmCmd.AddCommand(farmGetCmd) farmGetCmd.Flags().Uint64P("farm-id", "i", 0, "farm id") + if err := farmGetCmd.MarkFlagRequired("farm-id"); err != nil { + log.Fatal().Err(err).Send() + } } diff --git a/registrar-cli/cmd/farm_update.go b/registrar-cli/cmd/farm_update.go index 2b5566d..f0cd43c 100644 --- a/registrar-cli/cmd/farm_update.go +++ b/registrar-cli/cmd/farm_update.go @@ -56,11 +56,11 @@ var farmUpdateCmd = &cobra.Command{ func init() { farmCmd.AddCommand(farmUpdateCmd) farmUpdateCmd.Flags().StringP("mnemonic", "m", "", "account mnemonic") - if err := farmUpdateCmd.MarkFlagRequired("mnemonic"); err != nil { - log.Fatal().Err(err).Send() - } farmUpdateCmd.Flags().Uint64P("farm-id", "i", 0, "farm id") farmUpdateCmd.Flags().String("farm-name", "", "new farm name") + farmUpdateCmd.MarkFlagsRequiredTogether("mnemonic", "farm-id", "farm-name") + farmUpdateCmd.Flags().StringP("stellar-address", "s", "", "stellar address") farmUpdateCmd.Flags().BoolP("dedicated", "d", false, "farm is dedicated") + farmUpdateCmd.MarkFlagsOneRequired("stellar-address", "dedicated") } diff --git a/registrar-cli/cmd/node_get.go b/registrar-cli/cmd/node_get.go index 535790c..b4295cc 100644 --- a/registrar-cli/cmd/node_get.go +++ b/registrar-cli/cmd/node_get.go @@ -42,4 +42,5 @@ func init() { nodeCmd.AddCommand(nodeGetCmd) nodeGetCmd.Flags().Uint64("node-id", 0, "node id") nodeGetCmd.Flags().Uint64("twin-id", 0, "twin id") + nodeGetCmd.MarkFlagsOneRequired("node-id", "twin-id") } diff --git a/registrar-cli/cmd/root.go b/registrar-cli/cmd/root.go index d24c087..0c1209b 100644 --- a/registrar-cli/cmd/root.go +++ b/registrar-cli/cmd/root.go @@ -30,7 +30,4 @@ func init() { zerolog.SetGlobalLevel(zerolog.InfoLevel) log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr}) rootCmd.PersistentFlags().StringP("network", "n", "", "network (dev, qa, test, main)") - if err := rootCmd.MarkFlagRequired("network"); err != nil { - log.Fatal().Err(err).Send() - } } diff --git a/registrar-cli/cmd/zos_version_update.go b/registrar-cli/cmd/zos_version_update.go index 74adfcf..ea8a47e 100644 --- a/registrar-cli/cmd/zos_version_update.go +++ b/registrar-cli/cmd/zos_version_update.go @@ -46,9 +46,7 @@ var zosVersionUpdateCmd = &cobra.Command{ func init() { zosVersionCmd.AddCommand(zosVersionUpdateCmd) zosVersionUpdateCmd.Flags().StringP("mnemonic", "m", "", "account mnemonic") - if err := zosVersionUpdateCmd.MarkFlagRequired("mnemonic"); err != nil { - log.Fatal().Err(err).Send() - } zosVersionUpdateCmd.Flags().StringP("version", "v", "v0.0.0", "new zos version") zosVersionUpdateCmd.Flags().BoolP("safe-to-upgrade", "u", false, "safe to upgrade") + zosVersionUpdateCmd.MarkFlagsRequiredTogether("mnemonic", "version", "safe-to-upgrade") } diff --git a/registrar-cli/internal/cmd/account.go b/registrar-cli/internal/cmd/account.go index 818333f..5fa73a8 100644 --- a/registrar-cli/internal/cmd/account.go +++ b/registrar-cli/internal/cmd/account.go @@ -35,11 +35,6 @@ func GetAccount(network string, twinID uint64, pk string) (account client.Accoun return account, fmt.Errorf("invalid network %s", network) } - publicKey, err := hex.DecodeString(pk) - if err != nil { - return - } - cli, err := client.NewRegistrarClient(u) if err != nil { return @@ -47,7 +42,13 @@ func GetAccount(network string, twinID uint64, pk string) (account client.Accoun if twinID != 0 { return cli.GetAccount(twinID) - } else if len(publicKey) != 0 { + } else if len(pk) != 0 { + + publicKey, err := hex.DecodeString(pk) + if err != nil { + return account, err + } + return cli.GetAccountByPK(publicKey) } From c895c064b997c0adbc7a1e39789fd182de508187 Mon Sep 17 00:00:00 2001 From: Eslam-Nawara Date: Mon, 7 Apr 2025 16:56:42 +0200 Subject: [PATCH 13/17] fix typo --- registrar-cli/README.md | 2 +- registrar-cli/cmd/zos_version_update.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/registrar-cli/README.md b/registrar-cli/README.md index c7d367a..2c18fc9 100644 --- a/registrar-cli/README.md +++ b/registrar-cli/README.md @@ -189,7 +189,7 @@ Zos Version command represents events on zos version on Threefold grid4 ```sh ➜ ./registrar-cli zos-version update --network dev --version v0.1.8 --safe-to-upgrade --mnemonic -5:07PM INF farm is updated successfully +5:07PM INF zos version is updated successfully ➜ ➜ ./registrar-cli zos-version get --network dev 5:07PM INF zosVersion={"safe_to_upgrade":true,"version":"v0.1.8"} diff --git a/registrar-cli/cmd/zos_version_update.go b/registrar-cli/cmd/zos_version_update.go index ea8a47e..8f3e9ce 100644 --- a/registrar-cli/cmd/zos_version_update.go +++ b/registrar-cli/cmd/zos_version_update.go @@ -37,7 +37,7 @@ var zosVersionUpdateCmd = &cobra.Command{ return err } - log.Info().Msg("farm is updated successfully") + log.Info().Msg("zos version is updated successfully") return nil }, From 1099222598746066e783fc884bb8d166a4fae2aa Mon Sep 17 00:00:00 2001 From: Eslam-Nawara Date: Wed, 9 Apr 2025 18:04:47 +0200 Subject: [PATCH 14/17] mark safe-to-upgrade as not required --- registrar-cli/cmd/zos_version_update.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/registrar-cli/cmd/zos_version_update.go b/registrar-cli/cmd/zos_version_update.go index 8f3e9ce..91e918b 100644 --- a/registrar-cli/cmd/zos_version_update.go +++ b/registrar-cli/cmd/zos_version_update.go @@ -48,5 +48,5 @@ func init() { zosVersionUpdateCmd.Flags().StringP("mnemonic", "m", "", "account mnemonic") zosVersionUpdateCmd.Flags().StringP("version", "v", "v0.0.0", "new zos version") zosVersionUpdateCmd.Flags().BoolP("safe-to-upgrade", "u", false, "safe to upgrade") - zosVersionUpdateCmd.MarkFlagsRequiredTogether("mnemonic", "version", "safe-to-upgrade") + zosVersionUpdateCmd.MarkFlagsRequiredTogether("mnemonic", "version") } From 0446530bd652a367716ad43b28043606be313c88 Mon Sep 17 00:00:00 2001 From: Eslam-Nawara Date: Mon, 12 May 2025 18:20:53 +0300 Subject: [PATCH 15/17] refactor registrar cli --- go.work.sum | 5 ----- node-registrar/tools/farm/README.md | 19 ++++++++++++++---- node-registrar/tools/farm/main.go | 2 +- registrar-cli/README.md | 6 +++--- registrar-cli/cmd/account_create.go | 9 ++++----- registrar-cli/cmd/account_get.go | 10 +++++----- registrar-cli/cmd/farm_create.go | 31 ++++++++++++++++++++--------- registrar-cli/cmd/farm_get.go | 11 +++++----- registrar-cli/cmd/farm_update.go | 20 +++++++++---------- registrar-cli/cmd/node_get.go | 10 +++++----- registrar-cli/internal/cmd/farm.go | 14 +++++++++---- registrar-cli/internal/cmd/node.go | 7 ++++--- 12 files changed, 84 insertions(+), 60 deletions(-) diff --git a/go.work.sum b/go.work.sum index 8f864d2..cdaf55e 100644 --- a/go.work.sum +++ b/go.work.sum @@ -106,17 +106,12 @@ golang.org/x/exp v0.0.0-20230206171751-46f607a40771/go.mod h1:CxIveKay+FTh1D0yPZ golang.org/x/image v0.25.0/go.mod h1:tCAmOEGthTtkalusGp1g3xa2gke8J6c2N565dTyl9Rs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= -golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= -golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= diff --git a/node-registrar/tools/farm/README.md b/node-registrar/tools/farm/README.md index 55a1765..5cf7147 100644 --- a/node-registrar/tools/farm/README.md +++ b/node-registrar/tools/farm/README.md @@ -1,38 +1,49 @@ # New Farm Tool ## Overview + This tool allows users to create a farm account on a specified network. ## Installation + 1. Clone the repository: + ```sh git clone https://github.com/threefoldtech/tfgrid4-sdk-go ``` + 2. Navigate to the project directory: + ```sh cd tfgrid4-sdk-go/node-registrar/tools/farm ``` + 3. Build the application: + ```sh go build -o new-farm main.go ``` ## Usage + ```sh -./new-farm -seed -network -farm_name +./new-farm -seed -network -farm-name ``` ### Parameters + - `-seed` (required): A hexadecimal string used as a private key seed. - `-network` (required): Specifies the network (`dev`, `qa`, `test`, `main`). -- `-farm_name` (required): The name of the farm to create. +- `-farm-name` (required): The name of the farm to create. ### Example Usage + ```sh -./new-farm -seed aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899 -network dev -farm_name MyFarm +./new-farm -seed aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899 -network dev -farm-name MyFarm ``` + The `FarmID` (e.g., `11`) is returned upon successful farm creation. ## Next Step -Once this is done, you can create a V4 bootstrap image using the V4 Zero-OS Boot Generator: https://v4.bootstrap.grid.tf/. \ No newline at end of file +Once this is done, you can create a V4 bootstrap image using the V4 Zero-OS Boot Generator: . diff --git a/node-registrar/tools/farm/main.go b/node-registrar/tools/farm/main.go index 15a1eab..fedc747 100644 --- a/node-registrar/tools/farm/main.go +++ b/node-registrar/tools/farm/main.go @@ -29,7 +29,7 @@ func main() { flag.StringVar(&seed, "seed", "", "seed") flag.StringVar(&network, "network", "", "network (dev, qa, test, main)") - flag.StringVar(&name, "farm_name", "", "farm name") + flag.StringVar(&name, "farm-name", "", "farm name") flag.Parse() u, ok := urls[network] diff --git a/registrar-cli/README.md b/registrar-cli/README.md index 2c18fc9..b2c51bb 100644 --- a/registrar-cli/README.md +++ b/registrar-cli/README.md @@ -61,7 +61,7 @@ Account command represents events on account on Threefold grid4 ➜ ./registrar-cli account get --network dev --twin-id 33 5:00PM INF account={"public_key":"w5TYTeB/rCskd1iNrOKaFlpGn+Cp28gFZobTNABUv50=","relays":[],"rmb_enc_key":"","twin_id":33} ➜ -➜ ./registrar-cli account get --network dev --public-key +➜ ./registrar-cli account get --network dev --public-key 5:01PM INF account={"public_key":"w5TYTeB/rCskd1iNrOKaFlpGn+Cp28gFZobTNABUv50=","relays":[],"rmb_enc_key":"","twin_id":33} ``` @@ -92,7 +92,7 @@ Farm command represents events on farms on Threefold grid4 **Flags**: -- `--farm_name` (required): The name of the farm to create. +- `--farm-name` (required): The name of the farm to create. - `--network` (required): Specifies the network (`dev`, `qa`, `test`, `main`). - `--mnemonic` (required): Account mnemonic. - `--dedicated` (optional default: false): is the farm dedicated. @@ -125,7 +125,7 @@ Farm command represents events on farms on Threefold grid4 - `--network` (required): Specifies the network (`dev`, `qa`, `test`, `main`). - `--mnemonic` (required): Account mnemonic. - `--farm-id` (optional): id of the farm needed to be loaded. -- `--farm_name` (optional): The new name of the farm. +- `--farm-name` (optional): The new name of the farm. - `--dedicated` (optional): update the farm to dedicated. **Example Usage**: diff --git a/registrar-cli/cmd/account_create.go b/registrar-cli/cmd/account_create.go index 929589e..7ba7e68 100644 --- a/registrar-cli/cmd/account_create.go +++ b/registrar-cli/cmd/account_create.go @@ -2,6 +2,7 @@ package cmd import ( + "github.com/pkg/errors" "github.com/rs/zerolog/log" "github.com/spf13/cobra" "github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli/internal/cmd" @@ -14,12 +15,12 @@ var accountCreateCmd = &cobra.Command{ RunE: func(cobraCmd *cobra.Command, args []string) error { mnemonic, err := cobraCmd.Flags().GetString("mnemonic") if err != nil { - return err + return errors.Wrap(err, "failed to get mnemonic flag") } network, err := cobraCmd.Flags().GetString("network") if err != nil { - return err + return errors.Wrap(err, "failed to get network flag") } relays, err := cobraCmd.Flags().GetStringArray("relays") @@ -34,12 +35,10 @@ var accountCreateCmd = &cobra.Command{ account, mnemonic, err := cmd.CreateAccount(network, relays, rmbEncKey, mnemonic) if err != nil { - return err + return errors.Wrap(err, "failed to create account") } log.Info().Str("mnemonic", mnemonic).Msg("new account is created with mnemonic") - log.Info().Uint64("twinID", account.TwinID).Msg("account is created successfully") - return nil }, } diff --git a/registrar-cli/cmd/account_get.go b/registrar-cli/cmd/account_get.go index dcc610f..f004875 100644 --- a/registrar-cli/cmd/account_get.go +++ b/registrar-cli/cmd/account_get.go @@ -2,6 +2,7 @@ package cmd import ( + "github.com/pkg/errors" "github.com/rs/zerolog/log" "github.com/spf13/cobra" "github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli/internal/cmd" @@ -14,26 +15,25 @@ var accountGetCmd = &cobra.Command{ RunE: func(cobraCmd *cobra.Command, args []string) error { network, err := cobraCmd.Flags().GetString("network") if err != nil { - return err + return errors.Wrap(err, "failed to get network flag") } twinID, err := cobraCmd.Flags().GetUint64("twin-id") if err != nil { - return err + return errors.Wrap(err, "failed to get twin-id flag") } pk, err := cobraCmd.Flags().GetString("public-key") if err != nil { - return err + return errors.Wrap(err, "failed to get public-key flag") } account, err := cmd.GetAccount(network, twinID, pk) if err != nil { - return err + return errors.Wrap(err, "failed to get account") } log.Info().Any("account", account).Send() - return nil }, } diff --git a/registrar-cli/cmd/farm_create.go b/registrar-cli/cmd/farm_create.go index 5ae805b..98a9bd4 100644 --- a/registrar-cli/cmd/farm_create.go +++ b/registrar-cli/cmd/farm_create.go @@ -2,6 +2,7 @@ package cmd import ( + "github.com/pkg/errors" "github.com/rs/zerolog/log" "github.com/spf13/cobra" "github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli/internal/cmd" @@ -14,36 +15,48 @@ var farmCreateCmd = &cobra.Command{ RunE: func(cobraCmd *cobra.Command, args []string) error { mnemonic, err := cobraCmd.Flags().GetString("mnemonic") if err != nil { - return err + return errors.Wrap(err, "failed to get mnemonic flag") } network, err := cobraCmd.Flags().GetString("network") if err != nil { - return err + return errors.Wrap(err, "failed to get network flag") } farmName, err := cobraCmd.Flags().GetString("farm-name") if err != nil { - return err + return errors.Wrap(err, "failed to get farm-name flag") } - stellarAddrss, err := cobraCmd.Flags().GetString("stellar-address") + stellarAddress, err := cobraCmd.Flags().GetString("stellar-address") if err != nil { - return err + return errors.Wrap(err, "failed to get stellar-address flag") } dedicated, err := cobraCmd.Flags().GetBool("dedicated") if err != nil { - return err + return errors.Wrap(err, "failed to get dedicated flag") } - farmID, err := cmd.CreateFarm(mnemonic, network, farmName, stellarAddrss, dedicated) + // Validate required inputs + if farmName == "" { + return errors.New("farm name is required (use --farm-name flag)") + } + + if network == "" { + return errors.New("network is required (use --network flag)") + } + + if mnemonic == "" { + return errors.New("mnemonic is required (use --mnemonic flag)") + } + + farmID, err := cmd.CreateFarm(mnemonic, network, farmName, stellarAddress, dedicated) if err != nil { - return err + return errors.Wrap(err, "failed to create farm") } log.Info().Uint64("farmID", farmID).Msg("farm is created successfully") - return nil }, } diff --git a/registrar-cli/cmd/farm_get.go b/registrar-cli/cmd/farm_get.go index 9d08e21..6f111bc 100644 --- a/registrar-cli/cmd/farm_get.go +++ b/registrar-cli/cmd/farm_get.go @@ -2,8 +2,7 @@ package cmd import ( - "fmt" - + "github.com/pkg/errors" "github.com/rs/zerolog/log" "github.com/spf13/cobra" "github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli/internal/cmd" @@ -16,21 +15,21 @@ var farmGetCmd = &cobra.Command{ RunE: func(cobraCmd *cobra.Command, args []string) error { network, err := cobraCmd.Flags().GetString("network") if err != nil { - return err + return errors.Wrap(err, "failed to get network flag") } farmID, err := cobraCmd.Flags().GetUint64("farm-id") if err != nil { - return err + return errors.Wrap(err, "failed to get farm-id flag") } if farmID == 0 { - return fmt.Errorf("you need to provide farm id to load a farm") + return errors.New("farm id is required (use --farm-id flag with a non-zero value)") } farm, err := cmd.GetFarm(network, farmID) if err != nil { - return err + return errors.Wrap(err, "failed to get farm") } log.Info().Any("farm", farm).Send() diff --git a/registrar-cli/cmd/farm_update.go b/registrar-cli/cmd/farm_update.go index f0cd43c..306e78f 100644 --- a/registrar-cli/cmd/farm_update.go +++ b/registrar-cli/cmd/farm_update.go @@ -2,6 +2,7 @@ package cmd import ( + "github.com/pkg/errors" "github.com/rs/zerolog/log" "github.com/spf13/cobra" "github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli/internal/cmd" @@ -14,41 +15,40 @@ var farmUpdateCmd = &cobra.Command{ RunE: func(cobraCmd *cobra.Command, args []string) error { mnemonic, err := cobraCmd.Flags().GetString("mnemonic") if err != nil { - return err + return errors.Wrap(err, "failed to get mnemonic flag") } network, err := cobraCmd.Flags().GetString("network") if err != nil { - return err + return errors.Wrap(err, "failed to get network flag") } farmID, err := cobraCmd.Flags().GetUint64("farm-id") if err != nil { - return err + return errors.Wrap(err, "failed to get farm-id flag") } farmName, err := cobraCmd.Flags().GetString("farm-name") if err != nil { - return err + return errors.Wrap(err, "failed to get farm-name flag") } - stellarAddrss, err := cobraCmd.Flags().GetString("stellar-address") + stellarAddress, err := cobraCmd.Flags().GetString("stellar-address") if err != nil { - return err + return errors.Wrap(err, "failed to get stellar-address flag") } dedicated, err := cobraCmd.Flags().GetBool("dedicated") if err != nil { - return err + return errors.Wrap(err, "failed to get dedicated flag") } - err = cmd.UpdateFarm(farmID, mnemonic, network, farmName, stellarAddrss, dedicated) + err = cmd.UpdateFarm(farmID, mnemonic, network, farmName, stellarAddress, dedicated) if err != nil { - return err + return errors.Wrap(err, "failed to update farm") } log.Info().Msg("farm is updated successfully") - return nil }, } diff --git a/registrar-cli/cmd/node_get.go b/registrar-cli/cmd/node_get.go index b4295cc..cb5a058 100644 --- a/registrar-cli/cmd/node_get.go +++ b/registrar-cli/cmd/node_get.go @@ -2,6 +2,7 @@ package cmd import ( + "github.com/pkg/errors" "github.com/rs/zerolog/log" "github.com/spf13/cobra" "github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli/internal/cmd" @@ -14,26 +15,25 @@ var nodeGetCmd = &cobra.Command{ RunE: func(cobraCmd *cobra.Command, args []string) error { network, err := cobraCmd.Flags().GetString("network") if err != nil { - return err + return errors.Wrap(err, "failed to get network flag") } nodeID, err := cobraCmd.Flags().GetUint64("node-id") if err != nil { - return err + return errors.Wrap(err, "failed to get node-id flag") } twinID, err := cobraCmd.Flags().GetUint64("twin-id") if err != nil { - return err + return errors.Wrap(err, "failed to get twin-id flag") } node, err := cmd.GetNode(network, nodeID, twinID) if err != nil { - return err + return errors.Wrap(err, "failed to get node") } log.Info().Any("node", node).Send() - return nil }, } diff --git a/registrar-cli/internal/cmd/farm.go b/registrar-cli/internal/cmd/farm.go index 96c6288..ad58b7c 100644 --- a/registrar-cli/internal/cmd/farm.go +++ b/registrar-cli/internal/cmd/farm.go @@ -3,25 +3,31 @@ package cmd import ( "fmt" + "github.com/pkg/errors" "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" ) func CreateFarm(mnemonic, network, farmName, stellarAddress string, dedicated bool) (farmID uint64, err error) { u, ok := urls[network] if !ok { - return farmID, fmt.Errorf("invalid network %s", network) + return farmID, fmt.Errorf("invalid network %s (must be one of: dev, qa, test, main)", network) } if len(mnemonic) == 0 { - return farmID, fmt.Errorf("can not initialize registrar client with no mnemonic") + return farmID, errors.New("empty mnemonic provided") } cli, err := client.NewRegistrarClient(u, mnemonic) if err != nil { - return + return farmID, errors.Wrap(err, "client initialization failed") + } + + farmID, err = cli.CreateFarm(farmName, stellarAddress, dedicated) + if err != nil { + return farmID, errors.Wrap(err, "farm creation failed") } - return cli.CreateFarm(farmName, stellarAddress, dedicated) + return farmID, nil } func GetFarm(network string, farmID uint64) (farm client.Farm, err error) { diff --git a/registrar-cli/internal/cmd/node.go b/registrar-cli/internal/cmd/node.go index d132822..66d4a3f 100644 --- a/registrar-cli/internal/cmd/node.go +++ b/registrar-cli/internal/cmd/node.go @@ -3,18 +3,19 @@ package cmd import ( "fmt" + "github.com/pkg/errors" "github.com/threefoldtech/tfgrid4-sdk-go/node-registrar/client" ) func GetNode(network string, nodeID, twinID uint64) (node client.Node, err error) { u, ok := urls[network] if !ok { - return node, fmt.Errorf("invalid network %s", network) + return node, fmt.Errorf("invalid network %s (must be one of: dev, qa, test, main)", network) } cli, err := client.NewRegistrarClient(u) if err != nil { - return + return node, errors.Wrap(err, "client initialization failed") } if nodeID != 0 { @@ -29,7 +30,7 @@ func GetNode(network string, nodeID, twinID uint64) (node client.Node, err error return } } else { - return node, fmt.Errorf("you need to provide either twin id or node id to load a node") + return client.Node{}, fmt.Errorf("you need to provide either twin id or node id to load a node") } return From 51084bab7313dfbe2112ef972085542efe538974 Mon Sep 17 00:00:00 2001 From: Eslam-Nawara Date: Wed, 14 May 2025 14:03:01 +0300 Subject: [PATCH 16/17] allow update farm with stellar address --- registrar-cli/cmd/farm_update.go | 2 +- registrar-cli/internal/cmd/farm.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/registrar-cli/cmd/farm_update.go b/registrar-cli/cmd/farm_update.go index 306e78f..a31887f 100644 --- a/registrar-cli/cmd/farm_update.go +++ b/registrar-cli/cmd/farm_update.go @@ -58,7 +58,7 @@ func init() { farmUpdateCmd.Flags().StringP("mnemonic", "m", "", "account mnemonic") farmUpdateCmd.Flags().Uint64P("farm-id", "i", 0, "farm id") farmUpdateCmd.Flags().String("farm-name", "", "new farm name") - farmUpdateCmd.MarkFlagsRequiredTogether("mnemonic", "farm-id", "farm-name") + farmUpdateCmd.MarkFlagsRequiredTogether("mnemonic", "farm-id") farmUpdateCmd.Flags().StringP("stellar-address", "s", "", "stellar address") farmUpdateCmd.Flags().BoolP("dedicated", "d", false, "farm is dedicated") diff --git a/registrar-cli/internal/cmd/farm.go b/registrar-cli/internal/cmd/farm.go index ad58b7c..67fe921 100644 --- a/registrar-cli/internal/cmd/farm.go +++ b/registrar-cli/internal/cmd/farm.go @@ -68,7 +68,7 @@ func UpdateFarm(farmID uint64, mnemonic, network, farmName, stellarAddress strin opts = append(opts, client.UpdateFarmWithDedicated()) } if len(stellarAddress) != 0 { - // opts = append(opts, client.Updfarm) + opts = append(opts, client.UpdateFarmWithStellarAddress(stellarAddress)) } return cli.UpdateFarm(farmID, opts...) From cc1721794c3e08488a944adc77bd1f8609690a5f Mon Sep 17 00:00:00 2001 From: Eslam-Nawara Date: Sun, 25 May 2025 15:34:58 +0300 Subject: [PATCH 17/17] use latest client --- node-registrar/client/farm.go | 3 --- registrar-cli/go.mod | 2 +- registrar-cli/go.sum | 2 -- registrar-cli/internal/cmd/farm.go | 11 ++++++----- 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/node-registrar/client/farm.go b/node-registrar/client/farm.go index 398c5b4..88fc1a8 100644 --- a/node-registrar/client/farm.go +++ b/node-registrar/client/farm.go @@ -286,9 +286,6 @@ func parseUpdateFarmOpts(update FarmUpdate) map[string]any { if update.StellarAddress != nil { data["stellar_address"] = *update.StellarAddress } - if len(cfg.stellarAddress) != 0 { - data["stellar_address"] = cfg.stellarAddress - } if update.Dedicated != nil { data["dedicated"] = *update.Dedicated diff --git a/registrar-cli/go.mod b/registrar-cli/go.mod index b331206..53a3572 100644 --- a/registrar-cli/go.mod +++ b/registrar-cli/go.mod @@ -3,6 +3,7 @@ module github.com/threefoldtech/tfgrid4-sdk-go/registrar-cli go 1.21.0 require ( + github.com/pkg/errors v0.9.1 github.com/rs/zerolog v1.33.0 github.com/spf13/cobra v1.9.1 github.com/threefoldtech/tfgrid4-sdk-go/node-registrar v0.0.0-20250226194238-c27651fbdd6e @@ -12,7 +13,6 @@ require ( github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/pkg/errors v0.9.1 // indirect github.com/spf13/pflag v1.0.6 // indirect golang.org/x/sys v0.28.0 // indirect ) diff --git a/registrar-cli/go.sum b/registrar-cli/go.sum index 37805b1..0c87a5a 100644 --- a/registrar-cli/go.sum +++ b/registrar-cli/go.sum @@ -25,8 +25,6 @@ github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/threefoldtech/tfgrid4-sdk-go/node-registrar v0.0.0-20250226140024-dc119126c93f h1:IJ0BULHQuYWT6UFFiZEhEB0QyFSSbyCPgcKaAVII4a4= -github.com/threefoldtech/tfgrid4-sdk-go/node-registrar v0.0.0-20250226140024-dc119126c93f/go.mod h1:x6Sluj6YKfelWzcNwsD2oqGO8dpRlH7fbmeIqEsK8hI= github.com/threefoldtech/tfgrid4-sdk-go/node-registrar v0.0.0-20250226194238-c27651fbdd6e h1:n/hq2t7txZNuQ53EMR+ikwvu3bSvZIerm1d6JiXbmro= github.com/threefoldtech/tfgrid4-sdk-go/node-registrar v0.0.0-20250226194238-c27651fbdd6e/go.mod h1:x6Sluj6YKfelWzcNwsD2oqGO8dpRlH7fbmeIqEsK8hI= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/registrar-cli/internal/cmd/farm.go b/registrar-cli/internal/cmd/farm.go index 67fe921..f1a6863 100644 --- a/registrar-cli/internal/cmd/farm.go +++ b/registrar-cli/internal/cmd/farm.go @@ -59,17 +59,18 @@ func UpdateFarm(farmID uint64, mnemonic, network, farmName, stellarAddress strin return err } - var opts []client.UpdateFarmOpts + var opts client.FarmUpdate if len(farmName) > 0 { - opts = append(opts, client.UpdateFarmWithName(farmName)) + opts.FarmName = &farmName } if dedicated { - opts = append(opts, client.UpdateFarmWithDedicated()) + trueVal := true + opts.Dedicated = &trueVal } if len(stellarAddress) != 0 { - opts = append(opts, client.UpdateFarmWithStellarAddress(stellarAddress)) + opts.StellarAddress = &stellarAddress } - return cli.UpdateFarm(farmID, opts...) + return cli.UpdateFarm(farmID, opts) }