func ExecService(do *definitions.Do) error { service, err := loaders.LoadServiceDefinition(do.Name, false, do.Operations.ContainerNumber) if err != nil { return err } util.Merge(service.Operations, do.Operations) // Get the main service container name, check if it's running. main := util.FindServiceContainer(do.Name, do.Operations.ContainerNumber, false) if main != nil { if service.Service.ExecHost == "" { log.Info("exec_host not found in service definition file") log.WithField("service", do.Name).Info("May not be able to communicate with the service") } else { service.Service.Environment = append(service.Service.Environment, fmt.Sprintf("%s=%s", service.Service.ExecHost, do.Name)) } // Use service's short name as a link alias. service.Service.Links = append(service.Service.Links, fmt.Sprintf("%s:%s", main.FullName, do.Name)) } // Override links on the command line. if len(do.Links) > 0 { service.Service.Links = do.Links } return perform.DockerExecService(service.Service, service.Operations) }
func PerformAppActionService(do *definitions.Do, app *definitions.Contracts) error { logger.Println("Performing Action. This can sometimes take a wee while.") logger.Infof("\t=>\t\t\t%s:%s\n", do.Service.Name, do.Service.Image) logger.Debugf("\t=>\t\t\t%s:%s\n", do.Service.WorkDir, do.Service.EntryPoint) do.Operations.ContainerType = definitions.TypeService if err := perform.DockerExecService(do.Service, do.Operations); err != nil { do.Result = "could not perform app action" return err } logger.Infof("Finished performing App Action.\n") return nil }
func PerformAppActionService(do *definitions.Do, app *definitions.Contracts) error { log.Warn("Performing action. This can sometimes take a wee while") log.WithFields(log.Fields{ "service": do.Service.Name, "image": do.Service.Image, }).Info() log.WithFields(log.Fields{ "workdir": do.Service.WorkDir, "entrypoint": do.Service.EntryPoint, }).Debug() do.Operations.ContainerType = definitions.TypeService if err := perform.DockerExecService(do.Service, do.Operations); err != nil { do.Result = "could not perform app action" return err } log.Info("Finished performing app action") return nil }
//------------------------------------------------------------------------ func startChain(do *definitions.Do, exec bool) error { chain, err := loaders.LoadChainDefinition(do.Name, false, do.Operations.ContainerNumber) if err != nil { logger.Errorln("Cannot start a chain I cannot find.") do.Result = "no file" return nil } if chain.Name == "" { logger.Errorln("Cannot start a chain without a name.") do.Result = "no name" return nil } // boot the dependencies (eg. keys) if err := bootDependencies(chain, do); err != nil { return err } chain.Service.Command = loaders.ErisChainStart util.Merge(chain.Operations, do.Operations) chain.Service.Environment = append(chain.Service.Environment, "CHAIN_ID="+chain.ChainID) chain.Service.Environment = append(chain.Service.Environment, do.Env...) if do.Run { chain.Service.Environment = append(chain.Service.Environment, "ERISDB_API=true") } chain.Service.Links = append(chain.Service.Links, do.Links...) logger.Infof("StartChainRaw to DockerRunService =>\t%s\n", chain.Service.Name) logger.Debugf("\twith ChainID =>\t\t%v\n", chain.ChainID) logger.Debugf("\twith Environment =>\t%v\n", chain.Service.Environment) logger.Debugf("\twith AllPortsPublshd =>\t%v\n", chain.Operations.PublishAllPorts) if exec { if do.Image != "" { chain.Service.Image = do.Image } chain.Operations.Args = do.Operations.Args logger.Debugf("\twith Args =>\t\t%v:%v\n", chain.Operations.Args, chain.Operations.Interactive) // This override is necessary because erisdb uses an entryPoint and // the perform package will respect the images entryPoint if it // exists. chain.Service.EntryPoint = "" chain.Service.Command = "" // there is literally never a reason not to randomize the ports. chain.Operations.PublishAllPorts = true // always link the chain to the exec container when doing chains exec // so that there is never any problems with sending info to the service (chain) container chain.Service.Links = append(chain.Service.Links, fmt.Sprintf("%s:%s", util.ContainersName("chain", chain.Name, 1), "chain")) err = perform.DockerExecService(chain.Service, chain.Operations) } else { err = perform.DockerRunService(chain.Service, chain.Operations) } if err != nil { do.Result = "error" return err } return nil }
// MakeChain runs the `eris-cm make` command in a docker container. // It returns an error. Note that if do.Known, do.AccountTypes // or do.ChainType are not set the command will run via interactive // shell. // // do.Name - name of the chain to be created (required) // do.Known - will use the mintgen tool to parse csv's and create a genesis.json (requires do.ChainMakeVals and do.ChainMakeActs) (optional) // do.ChainMakeVals - csv file to use for validators (optional) // do.ChainMakeActs - csv file to use for accounts (optional) // do.AccountTypes - use eris-cm make account-types paradigm (example: Root:1,Participants:25,...) (optional) // do.ChainType - use eris-cm make chain-types paradigm (example: simplechain) (optional) // do.Tarball - instead of outputing raw files in directories, output packages of tarbals (optional) // do.ZipFile - similar to do.Tarball except uses zipfiles (optional) // do.Verbose - verbose output (optional) // do.Debug - debug output (optional) // func MakeChain(do *definitions.Do) error { do.Service.Name = do.Name do.Service.Image = path.Join(version.ERIS_REG_DEF, version.ERIS_IMG_CM) do.Service.User = "******" do.Service.AutoData = true do.Service.Links = []string{fmt.Sprintf("%s:%s", util.ServiceContainersName("keys", do.Operations.ContainerNumber), "keys")} do.Service.Environment = []string{ fmt.Sprintf("ERIS_KEYS_PATH=http://keys:%d", 4767), // note, needs to be made aware of keys port... fmt.Sprintf("ERIS_CHAINMANAGER_ACCOUNTTYPES=%s", strings.Join(do.AccountTypes, ",")), fmt.Sprintf("ERIS_CHAINMANAGER_CHAINTYPE=%s", do.ChainType), fmt.Sprintf("ERIS_CHAINMANAGER_TARBALLS=%v", do.Tarball), fmt.Sprintf("ERIS_CHAINMANAGER_ZIPFILES=%v", do.ZipFile), fmt.Sprintf("ERIS_CHAINMANAGER_OUTPUT=%v", do.Output), fmt.Sprintf("ERIS_CHAINMANAGER_VERBOSE=%v", do.Verbose), fmt.Sprintf("ERIS_CHAINMANAGER_DEBUG=%v", do.Debug), } do.Operations.ContainerType = "service" do.Operations.SrvContainerName = util.ServiceContainersName(do.Name, do.Operations.ContainerNumber) do.Operations.DataContainerName = util.DataContainersName(do.Name, do.Operations.ContainerNumber) if do.RmD { do.Operations.Remove = true } if do.Known { log.Debug("Using MintGen rather than eris:cm") do.Service.EntryPoint = "mintgen" do.Service.Command = fmt.Sprintf("known %s --csv=%s,%s > %s", do.Name, do.ChainMakeVals, do.ChainMakeActs, path.Join(ErisContainerRoot, "chains", do.Name, "genesis.json")) } else { log.Debug("Using eris:cm rather than MintGen") do.Service.EntryPoint = fmt.Sprintf("eris-cm make %s", do.Name) } if !do.Known && len(do.AccountTypes) == 0 && do.ChainType == "" { do.Operations.Interactive = true do.Operations.Args = strings.Split(do.Service.EntryPoint, " ") } if do.Known { do.Operations.Args = append(do.Operations.Args, strings.Split(do.Service.Command, " ")...) do.Service.WorkDir = path.Join(ErisContainerRoot, "chains", do.Name) } doData := definitions.NowDo() doData.Name = do.Name doData.Operations.ContainerNumber = do.Operations.ContainerNumber doData.Operations.DataContainerName = util.DataContainersName(do.Name, do.Operations.ContainerNumber) doData.Operations.ContainerType = "service" if !do.RmD { defer data.RmData(doData) } doData.Source = AccountsTypePath doData.Destination = path.Join(ErisContainerRoot, "chains", "account-types") if err := data.ImportData(doData); err != nil { return err } doData.Source = ChainTypePath doData.Destination = path.Join(ErisContainerRoot, "chains", "chain-types") if err := data.ImportData(doData); err != nil { return err } chnPath := filepath.Join(ChainsPath, do.Name) if _, err := os.Stat(chnPath); !os.IsNotExist(err) { doData.Operations.Args = []string{"mkdir", "--parents", path.Join(ErisContainerRoot, "chains", do.Name)} if err := data.ExecData(doData); err != nil { return err } doData.Operations.Args = []string{} doData.Source = chnPath doData.Destination = path.Join(ErisContainerRoot, "chains", do.Name) if err := data.ImportData(doData); err != nil { return err } } if err := perform.DockerExecService(do.Service, do.Operations); err != nil { return err } doData.Source = path.Join(ErisContainerRoot, "chains") doData.Destination = ErisRoot return data.ExportData(doData) }