[MM-54852] Add mmctl command to download Support Packet (#25419)
* Add mmctl command to download Support Packet * Simplify file name * Revert "Simplify file name" This reverts commit 17084a3350605134ba338ffa25ce43a7c9482f1d. * Fix docs
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
88520e6740
Коммит
5e94af1302
@@ -6,6 +6,8 @@ package commands
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
"github.com/spf13/cobra"
|
||||
@@ -65,15 +67,28 @@ var SystemStatusCmd = &cobra.Command{
|
||||
RunE: withClient(systemStatusCmdF),
|
||||
}
|
||||
|
||||
var SystemSupportPacketCmd = &cobra.Command{
|
||||
Use: "supportpacket",
|
||||
Short: "Download a Support Packet",
|
||||
Long: "Generate and download a Support Packet of the server to share it with Mattermost Support",
|
||||
Example: ` system supportpacket`,
|
||||
Args: cobra.NoArgs,
|
||||
RunE: withClient(systemSupportPacketCmdF),
|
||||
}
|
||||
|
||||
func init() {
|
||||
SystemSetBusyCmd.Flags().UintP("seconds", "s", 3600, "Number of seconds until server is automatically marked as not busy.")
|
||||
_ = SystemSetBusyCmd.MarkFlagRequired("seconds")
|
||||
|
||||
SystemSupportPacketCmd.Flags().StringP("output-file", "o", "", "Output file name (default \"mattermost_support_packet_YYYY-MM-DD-HH-MM.zip\")")
|
||||
|
||||
SystemCmd.AddCommand(
|
||||
SystemGetBusyCmd,
|
||||
SystemSetBusyCmd,
|
||||
SystemClearBusyCmd,
|
||||
SystemVersionCmd,
|
||||
SystemStatusCmd,
|
||||
SystemSupportPacketCmd,
|
||||
)
|
||||
RootCmd.AddCommand(SystemCmd)
|
||||
}
|
||||
@@ -152,3 +167,36 @@ Filestore Status: {{.filestore_status}}`, status)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func systemSupportPacketCmdF(c client.Client, cmd *cobra.Command, _ []string) error {
|
||||
printer.SetSingle(true)
|
||||
|
||||
filename, err := cmd.Flags().GetString("output-file")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if filename == "" {
|
||||
filename = fmt.Sprintf("mattermost_support_packet_%s.zip", time.Now().Format("2006-01-02-03-04"))
|
||||
}
|
||||
|
||||
printer.Print("Downloading Support Packet")
|
||||
|
||||
data, _, err := c.GenerateSupportPacket(context.TODO())
|
||||
if err != nil {
|
||||
return fmt.Errorf("unable to fetch Support Packet: %w", err)
|
||||
}
|
||||
|
||||
file, err := os.Create(filename)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to create zip file: %w", err)
|
||||
}
|
||||
|
||||
_, err = file.Write(data)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to write to zip file: %w", err)
|
||||
}
|
||||
|
||||
printer.PrintT("Downloaded Support Packet to {{ .filename }}", map[string]string{"filename": filename})
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
package commands
|
||||
|
||||
import (
|
||||
"os"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/mattermost/mattermost/server/v8/cmd/mmctl/client"
|
||||
@@ -103,3 +105,61 @@ func (s *MmctlE2ETestSuite) TestClearBusyCmd() {
|
||||
s.Require().False(s.th.App.Srv().Platform().Busy.IsBusy())
|
||||
})
|
||||
}
|
||||
|
||||
func (s *MmctlE2ETestSuite) TestSupportPacketCmdF() {
|
||||
s.SetupEnterpriseTestHelper().InitBasic()
|
||||
|
||||
printer.SetFormat(printer.FormatPlain)
|
||||
s.T().Cleanup(func() { printer.SetFormat(printer.FormatJSON) })
|
||||
|
||||
s.Run("Download support packet with default filename", func() {
|
||||
printer.Clean()
|
||||
|
||||
s.T().Cleanup(cleanupSupportPacket(s.T()))
|
||||
|
||||
err := systemSupportPacketCmdF(s.th.SystemAdminClient, SystemSupportPacketCmd, []string{})
|
||||
s.Require().NoError(err)
|
||||
s.Require().Len(printer.GetLines(), 2)
|
||||
s.Require().Equal(printer.GetLines()[0], "Downloading Support Packet")
|
||||
s.Require().Contains(printer.GetLines()[1], "Downloaded Support Packet to ")
|
||||
s.Require().Len(printer.GetErrorLines(), 0)
|
||||
|
||||
var found bool
|
||||
|
||||
entries, err := os.ReadDir(".")
|
||||
s.Require().NoError(err)
|
||||
for _, e := range entries {
|
||||
if strings.HasPrefix(e.Name(), "mattermost_support_packet_") && strings.HasSuffix(e.Name(), ".zip") {
|
||||
b, err := os.ReadFile(e.Name())
|
||||
s.NoError(err)
|
||||
|
||||
s.NotEmpty(b, b)
|
||||
|
||||
found = true
|
||||
}
|
||||
}
|
||||
s.True(found)
|
||||
})
|
||||
|
||||
s.Run("Download support packet with custom filename", func() {
|
||||
printer.Clean()
|
||||
|
||||
err := SystemSupportPacketCmd.ParseFlags([]string{"-o", "foo.zip"})
|
||||
s.Require().NoError(err)
|
||||
|
||||
s.T().Cleanup(func() {
|
||||
s.Require().NoError(os.Remove("foo.zip"))
|
||||
})
|
||||
|
||||
err = systemSupportPacketCmdF(s.th.SystemAdminClient, SystemSupportPacketCmd, []string{})
|
||||
s.Require().NoError(err)
|
||||
s.Require().Len(printer.GetErrorLines(), 0)
|
||||
s.Require().Len(printer.GetLines(), 2)
|
||||
s.Require().Equal(printer.GetLines()[0], "Downloading Support Packet")
|
||||
s.Require().Equal(printer.GetLines()[1], "Downloaded Support Packet to foo.zip")
|
||||
|
||||
b, err := os.ReadFile("foo.zip")
|
||||
s.Require().NoError(err)
|
||||
s.NotNil(b, b)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -6,15 +6,19 @@ package commands
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/mattermost/mattermost/server/public/model"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/mattermost/mattermost/server/v8/cmd/mmctl/printer"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
func (s *MmctlUnitTestSuite) TestGetBusyCmd() {
|
||||
@@ -210,3 +214,102 @@ func (s *MmctlUnitTestSuite) TestServerStatusCmd() {
|
||||
s.Require().Len(printer.GetLines(), 0)
|
||||
})
|
||||
}
|
||||
|
||||
func cleanupSupportPacket(t *testing.T) func() {
|
||||
return func() {
|
||||
entries, err := os.ReadDir(".")
|
||||
require.NoError(t, err)
|
||||
for _, e := range entries {
|
||||
if strings.HasPrefix(e.Name(), "mattermost_support_packet_") && strings.HasSuffix(e.Name(), ".zip") {
|
||||
err = os.Remove(e.Name())
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (s *MmctlUnitTestSuite) TestSupportPacketCmdF() {
|
||||
printer.SetFormat(printer.FormatPlain)
|
||||
s.T().Cleanup(func() { printer.SetFormat(printer.FormatJSON) })
|
||||
|
||||
s.Run("Download support packet with default filename", func() {
|
||||
printer.Clean()
|
||||
|
||||
s.T().Cleanup(cleanupSupportPacket(s.T()))
|
||||
|
||||
data := []byte("some bytes")
|
||||
s.client.
|
||||
EXPECT().
|
||||
GenerateSupportPacket(context.TODO()).
|
||||
Return(data, &model.Response{}, nil).
|
||||
Times(1)
|
||||
|
||||
err := systemSupportPacketCmdF(s.client, SystemSupportPacketCmd, []string{})
|
||||
s.Require().NoError(err)
|
||||
s.Require().Len(printer.GetErrorLines(), 0)
|
||||
s.Require().Len(printer.GetLines(), 2)
|
||||
s.Require().Equal(printer.GetLines()[0], "Downloading Support Packet")
|
||||
s.Require().Contains(printer.GetLines()[1], "Downloaded Support Packet to ")
|
||||
|
||||
var found bool
|
||||
|
||||
entries, err := os.ReadDir(".")
|
||||
s.Require().NoError(err)
|
||||
for _, e := range entries {
|
||||
if strings.HasPrefix(e.Name(), "mattermost_support_packet_") && strings.HasSuffix(e.Name(), ".zip") {
|
||||
b, err := os.ReadFile(e.Name())
|
||||
s.NoError(err)
|
||||
s.Equal(b, data)
|
||||
|
||||
found = true
|
||||
}
|
||||
}
|
||||
|
||||
s.True(found)
|
||||
})
|
||||
|
||||
s.Run("Download support packet with custom filename", func() {
|
||||
printer.Clean()
|
||||
|
||||
data := []byte("some bytes")
|
||||
s.client.
|
||||
EXPECT().
|
||||
GenerateSupportPacket(context.TODO()).
|
||||
Return(data, &model.Response{}, nil).
|
||||
Times(1)
|
||||
|
||||
err := SystemSupportPacketCmd.ParseFlags([]string{"-o", "foo.zip"})
|
||||
s.Require().NoError(err)
|
||||
|
||||
s.T().Cleanup(func() {
|
||||
s.Require().NoError(os.Remove("foo.zip"))
|
||||
})
|
||||
|
||||
err = systemSupportPacketCmdF(s.client, SystemSupportPacketCmd, []string{})
|
||||
s.Require().NoError(err)
|
||||
s.Require().Len(printer.GetErrorLines(), 0)
|
||||
s.Require().Len(printer.GetLines(), 2)
|
||||
s.Require().Equal(printer.GetLines()[0], "Downloading Support Packet")
|
||||
s.Require().Equal(printer.GetLines()[1], "Downloaded Support Packet to foo.zip")
|
||||
|
||||
b, err := os.ReadFile("foo.zip")
|
||||
s.Require().NoError(err)
|
||||
s.Equal(b, data)
|
||||
})
|
||||
|
||||
s.Run("Request to the server fails", func() {
|
||||
printer.Clean()
|
||||
|
||||
s.client.
|
||||
EXPECT().
|
||||
GenerateSupportPacket(context.TODO()).
|
||||
Return(nil, &model.Response{}, errors.New("mock error")).
|
||||
Times(1)
|
||||
|
||||
err := systemSupportPacketCmdF(s.client, SystemSupportPacketCmd, []string{})
|
||||
s.Require().Error(err)
|
||||
s.Require().Len(printer.GetErrorLines(), 0)
|
||||
s.Require().Len(printer.GetLines(), 1)
|
||||
s.Require().Equal(printer.GetLines()[0], "Downloading Support Packet")
|
||||
})
|
||||
}
|
||||
|
||||
Ссылка в новой задаче
Block a user