From d9fa3c4076b849b2a7bc0b794e53257cf7d30951 Mon Sep 17 00:00:00 2001 From: AlexandrLitkevich Date: Mon, 27 Jan 2025 09:49:45 +0300 Subject: [PATCH] pack: Added TCM file packaging Closes #TNTP-1097 :wq new file: test/integration/pack/test_bundles/bundle4/bin/tarantool-cluster-manager_bin --- 00000000000000000000.snap | Bin 0 -> 5092 bytes cli/cmdcontext/cmdcontext.go | 8 +++++ cli/configure/configure.go | 32 ++++++++++++++++++ cli/pack/common.go | 12 +++++++ .../bundle4/bin/tarantool-cluster-manager_bin | 0 test/integration/pack/test_pack.py | 3 ++ 6 files changed, 55 insertions(+) create mode 100644 00000000000000000000.snap create mode 100644 test/integration/pack/test_bundles/bundle4/bin/tarantool-cluster-manager_bin diff --git a/00000000000000000000.snap b/00000000000000000000.snap new file mode 100644 index 0000000000000000000000000000000000000000..ba1f860eac8f2c383fc858974f2e3d8a0b197b7b GIT binary patch literal 5092 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 G5UuTlXpE%* literal 0 HcmV?d00001 diff --git a/cli/cmdcontext/cmdcontext.go b/cli/cmdcontext/cmdcontext.go index 044f4d7c9..f44768ec8 100644 --- a/cli/cmdcontext/cmdcontext.go +++ b/cli/cmdcontext/cmdcontext.go @@ -30,6 +30,12 @@ type TarantoolCli struct { version version.Version } +// TcmCli describes tarantool executable. +type TcmCli struct { + // Executable is a path to tcm executable. + Executable string +} + // GetVersion returns and caches the tarantool version. func (tntCli *TarantoolCli) GetVersion() (version.Version, error) { if tntCli.version.Str != "" { @@ -104,6 +110,8 @@ type CliCtx struct { Verbose bool // TarantoolCli is current tarantool cli. TarantoolCli TarantoolCli + // Tcmcli is current tcm cli. + TcmCli // IntegrityCheck is a public key used for integrity check. IntegrityCheck string // IntegrityCheckPeriod is an period during which the integrity check is reproduced. diff --git a/cli/configure/configure.go b/cli/configure/configure.go index 57d4c6236..7e3a7b20f 100644 --- a/cli/configure/configure.go +++ b/cli/configure/configure.go @@ -422,6 +422,9 @@ func Cli(cmdCtx *cmdcontext.CmdCtx) error { // Set default (system) tarantool binary, can be replaced by "local" or "system" later. cmdCtx.Cli.TarantoolCli.Executable, _ = exec.LookPath("tarantool") + // Set default (system) tcm binary, can be replaced by "local" or "system" later. + cmdCtx.Cli.TcmCli.Executable, _ = exec.LookPath("tcm") + switch { case cmdCtx.Cli.IsSystem: return configureSystemCli(cmdCtx) @@ -552,6 +555,30 @@ func detectLocalTt(cliOpts *config.CliOpts) (string, error) { return localCli, nil } +// detectLocalTcm searches for available Tcm executable. +func detectLocalTcm(cmdCtx *cmdcontext.CmdCtx, cliOpts *config.CliOpts) (string, error) { + localTcm, err := util.JoinAbspath(cliOpts.Env.BinDir, "tcm") + if err != nil { + return "", err + } + + if _, err := os.Stat(localTcm); err == nil { + if _, err := exec.LookPath(localTcm); err != nil { + return "", fmt.Errorf(`found Tcm binary '%s' isn't executable: %s`, + localTcm, err) + } + + cmdCtx.Cli.TcmCli.Executable = localTcm + } else if !os.IsNotExist(err) { + return "", fmt.Errorf("failed to get access to Tcm binary file: %s", err) + } + + log.Debugf("tcm executable found: '%s'", cmdCtx.Cli.TcmCli.Executable) + + return localTcm, nil +} + + // configureLocalCli configures Tarantool CLI if the launch is local. func configureLocalCli(cmdCtx *cmdcontext.CmdCtx) error { launchDir, err := os.Getwd() @@ -595,6 +622,11 @@ func configureLocalCli(cmdCtx *cmdcontext.CmdCtx) error { return err } + _, err = detectLocalTcm(cmdCtx, cliOpts) + if err != nil { + return err + } + var localCli string if !cmdCtx.Cli.IsSelfExec { localCli, err = detectLocalTt(cliOpts) diff --git a/cli/pack/common.go b/cli/pack/common.go index 6d726ef38..5ca9b65b1 100644 --- a/cli/pack/common.go +++ b/cli/pack/common.go @@ -266,6 +266,18 @@ func copyBinaries(bundleEnvPath string, packCtx *PackCtx, cmdCtx *cmdcontext.Cmd if err := util.CopyFileDeep(ttExecutable, util.JoinPaths(pkgBin, "tt")); err != nil { return fmt.Errorf("failed copying tt: %s", err) } + + // Copy tcm. + if packCtx.WithBinaries { + if cmdCtx.Cli.TcmCli.Executable == "" { + log.Warnf("Skip copying tcm binary: not found") + } else { + if err := util.CopyFileDeep(cmdCtx.Cli.TcmCli.Executable, + util.JoinPaths(pkgBin, "tcm")); err != nil { + return fmt.Errorf("failed copying tarantool: %s", err) + } + } + } return nil } diff --git a/test/integration/pack/test_bundles/bundle4/bin/tarantool-cluster-manager_bin b/test/integration/pack/test_bundles/bundle4/bin/tarantool-cluster-manager_bin new file mode 100644 index 000000000..e69de29bb diff --git a/test/integration/pack/test_pack.py b/test/integration/pack/test_pack.py index b6c00fd93..133ea7545 100644 --- a/test/integration/pack/test_pack.py +++ b/test/integration/pack/test_pack.py @@ -787,6 +787,7 @@ def test_pack_tgz_compat_with_binaries(tt_cmd, tmp_path): assert os.path.isfile(os.path.join(app_path, "tt")) assert os.path.isfile(os.path.join(app_path, "tarantool")) + assert os.path.isfile(os.path.join(app_path, "tcm")) script = ("cat > tarantool <