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  }