// viper read config file, marshal to definition struct, // load service, validate name and data container func LoadChainDefinition(chainName string, newCont bool, cNum ...int) (*definitions.Chain, error) { if len(cNum) == 0 { cNum = append(cNum, 0) } if cNum[0] == 0 { cNum[0] = util.AutoMagic(0, definitions.TypeChain, newCont) log.WithField("=>", fmt.Sprintf("%s:%d", chainName, cNum[0])).Debug("Loading chain definition (autoassigned)") } else { log.WithField("=>", fmt.Sprintf("%s:%d", chainName, cNum[0])).Debug("Loading chain definition") } chain := definitions.BlankChain() chain.Name = chainName chain.Operations.ContainerNumber = cNum[0] chain.Operations.ContainerType = definitions.TypeChain chain.Operations.Labels = util.Labels(chain.Name, chain.Operations) if err := setChainDefaults(chain); err != nil { return nil, err } chainConf, err := config.LoadViperConfig(filepath.Join(ChainsPath), chainName, "chain") if err != nil { return nil, err } // marshal chain and always reset the operational requirements // this will make sure to sync with docker so that if changes // have occured in the interim they are caught. if err = MarshalChainDefinition(chainConf, chain); err != nil { return nil, err } // Docker 1.6 (which eris doesn't support) had different linking mechanism. if ver, _ := util.DockerClientVersion(); ver >= version.DVER_MIN { if chain.Dependencies != nil { addDependencyVolumesAndLinks(chain.Dependencies, chain.Service, chain.Operations) } } checkChainNames(chain) log.WithFields(log.Fields{ "container number": chain.Operations.ContainerNumber, "environment": chain.Service.Environment, "entrypoint": chain.Service.EntryPoint, "cmd": chain.Service.Command, }).Debug("Chain definition loaded") return chain, nil }
// viper read config file, marshal to definition struct, // load service, validate name and data container func LoadChainDefinition(chainName string, newCont bool, cNum ...int) (*definitions.Chain, error) { if len(cNum) == 0 { cNum = append(cNum, 0) } if cNum[0] == 0 { cNum[0] = util.AutoMagic(0, "chain", newCont) logger.Debugf("Loading Chain Definition =>\t%s:%d (autoassigned)\n", chainName, cNum[0]) } else { logger.Debugf("Loading Chain Definition =>\t%s:%d\n", chainName, cNum[0]) } chain := definitions.BlankChain() chain.Name = chainName chain.Operations.ContainerNumber = cNum[0] if err := setChainDefaults(chain); err != nil { return nil, err } chainConf, err := config.LoadViperConfig(path.Join(BlockchainsPath), chainName, "chain") if err != nil { return nil, err } // marshal chain and always reset the operational requirements // this will make sure to sync with docker so that if changes // have occured in the interim they are caught. if err = MarshalChainDefinition(chainConf, chain); err != nil { return nil, err } // Docker 1.6 (which eris doesn't support) had different linking mechanism. if ver, _ := util.DockerClientVersion(); ver >= 1.7 { if chain.Dependencies != nil { addDependencyVolumesAndLinks(chain.Dependencies, chain.Service, chain.Operations) } } checkChainNames(chain) logger.Debugf("Chain Loader. ContNumber =>\t%d\n", chain.Operations.ContainerNumber) logger.Debugf("\twith Environment =>\t%v\n", chain.Service.Environment) logger.Debugf("\tBooting =>\t\t%v:%v\n", chain.Service.EntryPoint, chain.Service.Command) return chain, nil }
func LoadServiceDefinition(servName string, newCont bool, cNum ...int) (*definitions.ServiceDefinition, error) { if len(cNum) == 0 { cNum = append(cNum, 0) } if cNum[0] == 0 { cNum[0] = util.AutoMagic(0, definitions.TypeService, newCont) logger.Debugf("Loading Service Definition =>\t%s:%d (autoassigned)\n", servName, cNum[0]) } else { logger.Debugf("Loading Service Definition =>\t%s:%d\n", servName, cNum[0]) } srv := definitions.BlankServiceDefinition() srv.Operations.ContainerType = definitions.TypeService srv.Operations.ContainerNumber = cNum[0] srv.Operations.Labels = util.Labels(servName, srv.Operations) serviceConf, err := loadServiceDefinition(servName) if err != nil { return nil, err } if err = MarshalServiceDefinition(serviceConf, srv); err != nil { return nil, err } if srv.Service == nil { return nil, fmt.Errorf("No service given.") } if err = checkImage(srv.Service); err != nil { return nil, err } // Docker 1.6 (which eris doesn't support) had different linking mechanism. if ver, _ := util.DockerClientVersion(); ver >= version.DVER_MIN { addDependencyVolumesAndLinks(srv.Dependencies, srv.Service, srv.Operations) } ServiceFinalizeLoad(srv) return srv, nil }
Complete documentation is available at https://docs.erisindustries.com ` + "\nVersion:\n " + VERSION, PersistentPreRun: func(cmd *cobra.Command, args []string) { var logLevel log.LogLevel if do.Verbose { logLevel = 2 } else if do.Debug { logLevel = 3 } log.SetLoggers(logLevel, config.GlobalConfig.Writer, config.GlobalConfig.ErrorWriter) ipfs.IpfsHost = config.GlobalConfig.Config.IpfsHost util.DockerConnect(do.Verbose, do.MachineName) dockerVersion, _ := util.DockerClientVersion() marmot := "Come back after you have upgraded and the marmots will be happy to service your blockchain management needs" if dockerVersion < dVerMin { IfExit(fmt.Errorf("Eris requires docker version >= %v\nThe marmots have detected docker version: %v\n%s", dVerMin, dockerVersion, marmot)) } }, PersistentPostRun: func(cmd *cobra.Command, args []string) { err := config.SaveGlobalConfig(config.GlobalConfig.Config) if err != nil { logger.Errorln(err) } log.Flush() }, } func Execute() {
` + "\nVersion:\n " + VERSION, PersistentPreRun: func(cmd *cobra.Command, args []string) { log.SetFormatter(logger.ErisFormatter{}) log.SetLevel(log.WarnLevel) if do.Verbose { log.SetLevel(log.InfoLevel) } else if do.Debug { log.SetLevel(log.DebugLevel) } ipfs.IpfsHost = config.GlobalConfig.Config.IpfsHost util.DockerConnect(do.Verbose, do.MachineName) dockerVersion, err := util.DockerClientVersion() if err != nil { IfExit(fmt.Errorf("There was an error connecting to your docker daemon.\nCome back after you have resolved and the marmots will be happy to service your blockchain management needs\n\n%v", err)) } marmot := "Come back after you have upgraded and the marmots will be happy to service your blockchain management needs" if dockerVersion < dVerMin { IfExit(fmt.Errorf("Eris requires docker version >= %v\nThe marmots have detected docker version: %v\n%s", dVerMin, dockerVersion, marmot)) } }, PersistentPostRun: func(cmd *cobra.Command, args []string) { err := config.SaveGlobalConfig(config.GlobalConfig.Config) if err != nil { log.Errorln(err) } }, }
func ExportData(do *definitions.Do) error { if util.IsDataContainer(do.Name, do.Operations.ContainerNumber) { dVer, err := util.DockerClientVersion() if err != nil { return err } logger.Infoln("Exporting data container", do.Name) // we want to export to a temp directory. exportPath, err := ioutil.TempDir(os.TempDir(), do.Name) // TODO: do.Operations.ContainerNumber ? defer os.Remove(exportPath) if err != nil { return err } srv := PretendToBeAService(do.Name, do.Operations.ContainerNumber) service, exists := perform.ContainerExists(srv.Operations) if !exists { return fmt.Errorf("There is no data container for that service.") } cont, err := util.DockerClient.InspectContainer(service.ID) if err != nil { return err } reader, writer := io.Pipe() defer reader.Close() if do.Path != "" { do.Path = do.Path } else { do.Path = "/home/eris/.eris" } opts := docker.CopyFromContainerOptions{ OutputStream: writer, Container: service.ID, Resource: do.Path, } go func() { logger.Infof("Copying out of Cont. ID =>\t%s\n", service.ID) logger.Debugf("\tPath =>\t\t\t%s\n", do.Path) IfExit(util.DockerClient.CopyFromContainer(opts)) writer.Close() }() logger.Debugf("Untarring Package from Cont =>\t%s\n", exportPath) if err = util.Untar(reader, do.Name, exportPath); err != nil { return err } // docker actually exports to a `_data` folder for volumes // this section of the function moves whatever docker dumps // into exportPath/_data into export. ranging through the // volumes is probably overkill as we could just assume // that it *was* `_data` but in case docker changes later // we'll just keep it for now. this is specific to 1.7 and // below. For 1.8 we do not need to do this. os.Chdir(exportPath) var unTarDestination string for k, v := range cont.Volumes { if k == do.Path { unTarDestination = filepath.Base(v) } } logger.Debugf("Untarring to =>\t\t\t%s:%s\n", exportPath, unTarDestination) if dVer <= 1.7 { if err := moveOutOfDirAndRmDir(filepath.Join(exportPath, unTarDestination), exportPath); err != nil { return err } } // now if docker dumps to exportPath/.eris we should remove // move everything from .eris to exportPath if err := moveOutOfDirAndRmDir(filepath.Join(exportPath, ".eris"), exportPath); err != nil { return err } // finally remove everything in the data directory and move // the temp contents there prevDir := filepath.Join(DataContainersPath, do.Name) if _, err := os.Stat(prevDir); os.IsNotExist(err) { if e2 := os.MkdirAll(prevDir, 0666); e2 != nil { return fmt.Errorf("Error:\tThe marmots could neither find, nor had access to make the directory: (%s)\n", prevDir) } } ClearDir(prevDir) if err := moveOutOfDirAndRmDir(exportPath, prevDir); err != nil { return err } } else { return fmt.Errorf("I cannot find that data container. Please check the data container name you sent me.") } do.Result = "success" return nil }