// ImportData does what it says. It imports from a host's Source to a Dest // in a data container. It returns an error. // // do.Name - name of the data container to use (required) // do.Operations.ContainerNumber - container number (optional) // do.Source - directory which should be imported (required) // do.Destination - directory to _unload_ the payload into (required) // func ImportData(do *definitions.Do) error { log.WithFields(log.Fields{ "from": do.Source, "to": do.Destination, }).Debug("Importing") if util.IsDataContainer(do.Name, do.Operations.ContainerNumber) { 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.") } if err := checkErisContainerRoot(do, "import"); err != nil { return err } containerName := util.DataContainersName(do.Name, do.Operations.ContainerNumber) os.Chdir(do.Source) reader, err := util.Tar(do.Source, 0) if err != nil { return err } defer reader.Close() opts := docker.UploadToContainerOptions{ InputStream: reader, Path: do.Destination, NoOverwriteDirNonDir: true, } log.WithField("=>", containerName).Info("Copying into container") log.WithField("path", do.Source).Debug() if err := util.DockerClient.UploadToContainer(service.ID, opts); err != nil { return err } doChown := definitions.NowDo() doChown.Operations.DataContainerName = containerName doChown.Operations.ContainerType = "data" doChown.Operations.ContainerNumber = do.Operations.ContainerNumber //required b/c `docker cp` (UploadToContainer) goes in as root doChown.Operations.Args = []string{"chown", "--recursive", "eris", do.Destination} _, err = perform.DockerRunData(doChown.Operations, nil) if err != nil { return fmt.Errorf("Error changing owner: %v\n", err) } } else { log.WithField("name", do.Name).Info("Data container does not exist.") ops := loaders.LoadDataDefinition(do.Name, do.Operations.ContainerNumber) if err := perform.DockerCreateData(ops); err != nil { return fmt.Errorf("Error creating data container %v.", err) } return ImportData(do) } do.Result = "success" return nil }
func ImportData(do *definitions.Do) error { if util.IsDataContainer(do.Name, do.Operations.ContainerNumber) { 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.") } containerName := util.DataContainersName(do.Name, do.Operations.ContainerNumber) logger.Debugf("Importing FROM =>\t\t%s\n", do.Source) os.Chdir(do.Source) logger.Debugf("Importing TO =>\t\t\t%s\n", do.Destination) reader, err := util.Tar(do.Source, 0) if err != nil { return err } defer reader.Close() opts := docker.UploadToContainerOptions{ InputStream: reader, Path: do.Destination, NoOverwriteDirNonDir: true, } logger.Infof("Copying into Cont. ID =>\t%s\n", service.ID) logger.Debugf("\tPath =>\t\t\t%s\n", do.Source) if err := util.DockerClient.UploadToContainer(service.ID, opts); err != nil { return err } doChown := definitions.NowDo() doChown.Operations.DataContainerName = containerName doChown.Operations.ContainerType = "data" doChown.Operations.ContainerNumber = 1 doChown.Operations.Args = []string{"chown", "--recursive", "eris", do.Destination} _, err = perform.DockerRunData(doChown.Operations, nil) if err != nil { return fmt.Errorf("Error changing owner: %v\n", err) } } else { ops := loaders.LoadDataDefinition(do.Name, do.Operations.ContainerNumber) if err := perform.DockerCreateData(ops); err != nil { return fmt.Errorf("Error creating data container %v.", err) } return ImportData(do) } do.Result = "success" return nil }
func runContainer(t *testing.T, ops *def.Operation) []byte { oldWriter := config.GlobalConfig.Writer newWriter := new(bytes.Buffer) config.GlobalConfig.Writer = newWriter b, err := perform.DockerRunData(ops, nil) if err != nil { tests.IfExit(err) } logger.Debugf("Container ran =>\t\t%s:%v\n", ops.DataContainerName, ops.Args) config.GlobalConfig.Writer = oldWriter return b }
func RegisterChain(do *definitions.Do) error { // do.Name is mandatory if do.Name == "" { return fmt.Errorf("RegisterChain requires a chainame") } etcbChain := do.ChainID do.ChainID = do.Name // NOTE: registration expects you to have the data container if !util.IsDataContainer(do.Name, do.Operations.ContainerNumber) { return fmt.Errorf("Registration requires you to have a data container for the chain. Could not find data for %s", do.Name) } chain, err := loaders.LoadChainDefinition(do.Name, false, do.Operations.ContainerNumber) if err != nil { return err } log.WithField("image", chain.Service.Image).Debug("Chain loaded") // set chainid and other vars envVars := []string{ fmt.Sprintf("CHAIN_ID=%s", do.ChainID), // of the etcb chain fmt.Sprintf("PUBKEY=%s", do.Pubkey), // pubkey to register chain with fmt.Sprintf("ETCB_CHAIN_ID=%s", etcbChain), // chain id of the etcb chain fmt.Sprintf("NODE_ADDR=%s", do.Gateway), // etcb node to send the register tx to fmt.Sprintf("NEW_P2P_SEEDS=%s", do.Operations.Args[0]), // seeds to register for the chain // TODO: deal with multi seed (needs support in tendermint) } envVars = append(envVars, do.Env...) log.WithFields(log.Fields{ "environment": envVars, "links": do.Links, }).Debug("Registering chain with") chain.Service.Environment = append(chain.Service.Environment, envVars...) chain.Service.Links = append(chain.Service.Links, do.Links...) if err := bootDependencies(chain, do); err != nil { return err } log.WithFields(log.Fields{ "=>": chain.Service.Name, "image": chain.Service.Image, }).Debug("Performing chain container start") chain.Operations = loaders.LoadDataDefinition(chain.Service.Name, do.Operations.ContainerNumber) chain.Operations.Args = []string{loaders.ErisChainRegister} _, err = perform.DockerRunData(chain.Operations, chain.Service) return err }
func runContainer(t *testing.T, ops *def.Operation) []byte { oldWriter := config.GlobalConfig.Writer newWriter := new(bytes.Buffer) config.GlobalConfig.Writer = newWriter b, err := perform.DockerRunData(ops, nil) if err != nil { tests.IfExit(err) } log.WithFields(log.Fields{ "=>": ops.DataContainerName, "args": ops.Args, }).Debug("Container ran (from tests)") config.GlobalConfig.Writer = oldWriter return b }
// eris chains new --dir _ -g _ // the default chain_id is my_tests, so should be overwritten func TestChainsNewDirGen(t *testing.T) { chainID := "testChainsNewDirGen" myDir := filepath.Join(common.DataContainersPath, chainID) if err := os.MkdirAll(myDir, 0700); err != nil { tests.IfExit(err) } contents := "this is a file in the directory\n" if err := ioutil.WriteFile(filepath.Join(myDir, "file.file"), []byte(contents), 0664); err != nil { tests.IfExit(err) } do := def.NowDo() do.GenesisFile = filepath.Join(common.ChainsPath, "default", "genesis.json") do.Name = chainID do.Path = myDir do.Operations.ContainerNumber = 1 do.Operations.PublishAllPorts = true log.WithField("=>", do.Name).Info("Creating chain (from tests)") tests.IfExit(NewChain(do)) // remove the data container defer removeChainContainer(t, chainID, do.Operations.ContainerNumber) // verify the contents of file.file - swap config writer with bytes.Buffer // TODO: functions for facilitating this oldWriter := config.GlobalConfig.Writer newWriter := new(bytes.Buffer) config.GlobalConfig.Writer = newWriter ops := loaders.LoadDataDefinition(do.Name, do.Operations.ContainerNumber) util.Merge(ops, do.Operations) ops.Args = []string{"cat", fmt.Sprintf("/home/eris/.eris/file.file")} b, err := perform.DockerRunData(ops, nil) if err != nil { tests.IfExit(err) } config.GlobalConfig.Writer = oldWriter result := trimResult(string(b)) contents = trimResult(contents) if result != contents { tests.IfExit(fmt.Errorf("file not faithfully copied. Got: %s \n Expected: %s", result, contents)) } // verify the chain_id got swapped in the genesis.json // TODO: functions for facilitating this oldWriter = config.GlobalConfig.Writer newWriter = new(bytes.Buffer) config.GlobalConfig.Writer = newWriter ops = loaders.LoadDataDefinition(do.Name, do.Operations.ContainerNumber) util.Merge(ops, do.Operations) ops.Args = []string{"cat", fmt.Sprintf("/home/eris/.eris/chains/%s/genesis.json", chainID)} //, "|", "jq", ".chain_id"} b, err = perform.DockerRunData(ops, nil) if err != nil { tests.IfExit(err) } config.GlobalConfig.Writer = oldWriter result = string(b) s := struct { ChainID string `json:"chain_id"` }{} if err := json.Unmarshal([]byte(result), &s); err != nil { tests.IfExit(err) } if s.ChainID != chainID { tests.IfExit(fmt.Errorf("ChainID mismatch: got %s, expected %s", s.ChainID, chainID)) } }