github.com/hyperledger/burrow@v0.34.5-0.20220512172541-77f09336001d/cmd/burrow/commands/deploy.go (about) 1 package commands 2 3 import ( 4 "fmt" 5 "os" 6 "strings" 7 "time" 8 9 "github.com/go-kit/kit/log" 10 pkgs "github.com/hyperledger/burrow/deploy" 11 "github.com/hyperledger/burrow/deploy/def" 12 "github.com/hyperledger/burrow/deploy/proposals" 13 "github.com/hyperledger/burrow/logging" 14 "github.com/hyperledger/burrow/logging/loggers" 15 cli "github.com/jawher/mow.cli" 16 ) 17 18 // 15 seconds is like a long time man 19 const defaultChainTimeout = 15 * time.Second 20 21 // Deploy runs the desired playbook(s) 22 func Deploy(output Output) func(cmd *cli.Cmd) { 23 return func(cmd *cli.Cmd) { 24 chainOpt := cmd.StringOpt("c chain", "127.0.0.1:10997", "chain to be used in IP:PORT format") 25 26 signerOpt := cmd.StringOpt("s keys", "", 27 "IP:PORT of Burrow GRPC service which jobs should or otherwise transaction submitted unsigned for mempool signing in Burrow") 28 29 mempoolSigningOpt := cmd.BoolOpt("p mempool-signing", false, 30 "Use Burrow's own keys connection to sign transactions - means that Burrow instance must have access to input account keys. "+ 31 "Sequence numbers are set as transactions enter the mempool so concurrent transactions can be sent from same inputs.") 32 33 pathOpt := cmd.StringOpt("i dir", "", "root directory of app (will use pwd by default)") 34 35 defaultOutputOpt := cmd.StringOpt("o output", def.DefaultOutputFile, 36 "filename for playbook output file. by default, this name will reflect the playbook passed") 37 38 defaultSetsOpt := cmd.StringsOpt("e set", []string{}, 39 "default sets to use; operates the same way as the [set] jobs, only before the jobs file is ran (and after default address") 40 41 binPathOpt := cmd.StringOpt("b bin-path", "[dir]/bin", 42 "path to the bin directory jobs should use when saving binaries after the compile process defaults to --dir + /bin") 43 44 defaultGasOpt := cmd.StringOpt("g gas", "1111111111", 45 "default gas to use; can be overridden for any single job") 46 47 jobsOpt := cmd.IntOpt("j jobs", 1, 48 "default number of concurrent playbooks to run if multiple are specified") 49 50 addressOpt := cmd.StringOpt("a address", "", 51 "default address (or account name) to use; operates the same way as the [account] job, only before the deploy file is ran") 52 53 defaultFeeOpt := cmd.StringOpt("n fee", "99", "default fee to use") 54 55 defaultAmountOpt := cmd.StringOpt("m amount", "99", 56 "default amount to use") 57 58 verboseOpt := cmd.BoolOpt("v verbose", false, "verbose output") 59 60 localAbiOpt := cmd.BoolOpt("local-abi", false, "use local ABIs rather than fetching them from burrow") 61 62 wasmOpt := cmd.BoolOpt("wasm", false, "Compile to WASM using solang (experimental)") 63 64 debugOpt := cmd.BoolOpt("d debug", false, "debug level output") 65 66 proposalVerify := cmd.BoolOpt("proposal-verify", false, "Verify any proposal, do NOT create new proposal or vote") 67 68 proposalVote := cmd.BoolOpt("proposal-vote", false, "Vote for proposal, do NOT create new proposal") 69 70 proposalCreate := cmd.BoolOpt("proposal-create", false, "Create new proposal") 71 72 timeoutSecondsOpt := cmd.IntOpt("t timeout", int(defaultChainTimeout/time.Second), "Timeout to talk to the chain in seconds") 73 74 proposalList := cmd.StringOpt("list-proposals state", "", "List proposals, either all, executed, expired, or current") 75 76 playbooksArg := cmd.StringsArg("FILE", []string{}, 77 "path to playbook file which deploy should run. if also using the --dir flag, give the relative path to playbooks file, which should be in the same directory") 78 79 cmd.Spec = "[--chain=<host:port>] [--keys=<host:port>] [--mempool-signing] [--dir=<root directory>] " + 80 "[--output=<output file>] [--wasm] [--set=<KEY=VALUE>]... [--bin-path=<path>] [--gas=<gas>] " + 81 "[--jobs=<concurrent playbooks>] [--address=<address>] [--fee=<fee>] [--amount=<amount>] [--local-abi] " + 82 "[--verbose] [--debug] [--timeout=<timeout>] " + 83 "[--list-proposals=<state> | --proposal-create| --proposal-verify | --proposal-vote] [FILE...]" 84 85 cmd.Action = func() { 86 args := new(def.DeployArgs) 87 88 if *proposalVerify && *proposalVote { 89 output.Fatalf("Cannot combine --proposal-verify and --proposal-vote") 90 } 91 92 for _, e := range *defaultSetsOpt { 93 s := strings.Split(e, "=") 94 if len(s) != 2 || s[0] == "" { 95 output.Fatalf("`--set %s' should have format VARIABLE=value", e) 96 } 97 } 98 99 args.Chain = *chainOpt 100 args.KeysService = *signerOpt 101 args.MempoolSign = *mempoolSigningOpt 102 args.Timeout = *timeoutSecondsOpt 103 args.Path = *pathOpt 104 args.LocalABI = *localAbiOpt 105 args.Wasm = *wasmOpt 106 args.DefaultOutput = *defaultOutputOpt 107 args.DefaultSets = *defaultSetsOpt 108 args.BinPath = *binPathOpt 109 args.DefaultGas = *defaultGasOpt 110 args.Address = *addressOpt 111 args.DefaultFee = *defaultFeeOpt 112 args.DefaultAmount = *defaultAmountOpt 113 args.Verbose = *verboseOpt 114 args.Debug = *debugOpt 115 args.Jobs = *jobsOpt 116 args.ProposeVerify = *proposalVerify 117 args.ProposeVote = *proposalVote 118 args.ProposeCreate = *proposalCreate 119 stdoutLogger, err := loggers.NewStreamLogger(os.Stdout, loggers.TerminalFormat) 120 if err != nil { 121 output.Fatalf("Could not make logger: %v", err) 122 } 123 logger := logging.NewLogger(stdoutLogger) 124 handleTerm() 125 126 if !*debugOpt { 127 logger.Trace = log.NewNopLogger() 128 } 129 130 if *proposalList != "" { 131 state, err := proposals.ProposalStateFromString(*proposalList) 132 if err != nil { 133 output.Fatalf(err.Error()) 134 } 135 err = proposals.ListProposals(args, state, logger) 136 if err != nil { 137 output.Fatalf(err.Error()) 138 } 139 } else { 140 if len(*playbooksArg) == 0 { 141 output.Fatalf("incorrect usage: missing deployment yaml file(s)") 142 } 143 failures, err := pkgs.RunPlaybooks(args, *playbooksArg, logger) 144 if err != nil { 145 fmt.Fprintln(os.Stderr, err) 146 os.Exit(1) 147 } 148 if failures > 0 { 149 os.Exit(failures) 150 } 151 } 152 } 153 } 154 }