Path: blob/main/components/content-service/cmd/test.go
2498 views
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.1// Licensed under the GNU Affero General Public License (AGPL).2// See License.AGPL.txt in the project root for license information.34package cmd56import (7"context"8"encoding/json"9"fmt"10"os"11"time"1213"github.com/gitpod-io/gitpod/content-service/api/config"14"github.com/gitpod-io/gitpod/content-service/pkg/archive"15"github.com/gitpod-io/gitpod/content-service/pkg/storage"16"github.com/spf13/cobra"17)1819var options testOpts2021type testOpts struct {22owner string23workspace string24instance string25config string26}2728var testCmd = &cobra.Command{29Use: "test",30Short: "Test the content service",31}3233var directCmd = &cobra.Command{34Use: "direct",35Short: "direct",36}3738var directListCmd = &cobra.Command{39Use: "list <prefix>",40Short: "list",41Args: cobra.ExactArgs(1),42Example: "list test-owner/",43RunE: func(cmd *cobra.Command, args []string) error {44direct, err := createDirectAccess()45if err != nil {46return err47}4849objects, err := direct.ListObjects(context.Background(), args[0])50if err != nil {51return err52}5354for _, o := range objects {55fmt.Printf("object: %s\n", o)56}5758return nil59},60}6162var uploadOpts testUploadOpts6364type testUploadOpts struct {65path string66name string67instance bool68}6970var directUploadCmd = &cobra.Command{71Use: "upload",72Short: "upload",73Example: "upload --path ./backup.tar --name workspace-backup --to-instance",74RunE: func(cmd *cobra.Command, args []string) error {75direct, err := createDirectAccess()76if err != nil {77return err78}7980var bucket string81var object string8283if uploadOpts.instance {84bucket, object, err = direct.UploadInstance(context.Background(), uploadOpts.path, uploadOpts.name)85} else {86bucket, object, err = direct.Upload(context.Background(), uploadOpts.path, uploadOpts.name)87}8889if err != nil {90return err91}9293fmt.Printf("bucket: %s, object: %s\n", bucket, object)9495return nil96},97}9899var downloadOpts testDownloadOpts100101type testDownloadOpts struct {102destination string103name string104}105106var directDownloadCmd = &cobra.Command{107Use: "download",108Short: "download",109Example: "download --dest ./download --name workspace-backup",110RunE: func(cmd *cobra.Command, args []string) error {111direct, err := createDirectAccess()112if err != nil {113return err114}115116_, err = direct.Download(context.Background(), downloadOpts.destination, downloadOpts.name, []archive.IDMapping{})117if err != nil {118return err119}120121return nil122},123}124125var presignedCmd = &cobra.Command{126Use: "presigned",127Short: "presigned",128}129130var presignedUploadCmd = &cobra.Command{131Use: "upload <key>",132Short: "upload",133Args: cobra.ExactArgs(1),134Example: "upload gitpod-signed",135RunE: func(cmd *cobra.Command, args []string) error {136presigned, err := createPresignedAccess()137if err != nil {138return err139}140141info, err := presigned.SignUpload(context.Background(), "", args[0], &storage.SignedURLOptions{})142if err != nil {143return err144}145146fmt.Printf("%s\n", info.URL)147return nil148},149}150151var presignedDownloadCmd = &cobra.Command{152Use: "download <key>",153Short: "download",154Args: cobra.ExactArgs(1),155Example: "download test-owner/workspaces/test-workspace/gitpod-upload",156RunE: func(cmd *cobra.Command, args []string) error {157presigned, err := createPresignedAccess()158if err != nil {159return err160}161162info, err := presigned.SignDownload(context.Background(), "", args[0], &storage.SignedURLOptions{})163if err != nil {164return err165}166167fmt.Printf("%s\n", info.URL)168return nil169},170}171172var presignedUsageCmd = &cobra.Command{173Use: "usage <prefix>",174Short: "usage",175Args: cobra.ExactArgs(1),176Example: "usage test-owner/",177RunE: func(cmd *cobra.Command, args []string) error {178presigned, err := createPresignedAccess()179if err != nil {180return err181}182183size, err := presigned.DiskUsage(context.Background(), "", args[0])184if err != nil {185return err186}187188fmt.Printf("%v\n", size)189190return nil191},192}193194var presignedExistsCmd = &cobra.Command{195Use: "exists <key>",196Short: "exists",197Args: cobra.ExactArgs(1),198Example: "exists test-owner/workspaces/test-workspace/gitpod-upload",199RunE: func(cmd *cobra.Command, args []string) error {200presigned, err := createPresignedAccess()201if err != nil {202return err203}204205exists, err := presigned.ObjectExists(context.Background(), "", args[0])206if err != nil {207return err208}209fmt.Printf("%v\n", exists)210211return nil212},213}214215var presignedDeleteCmd = &cobra.Command{216Use: "delete",217Short: "delete",218}219220var presignedDeleteBucketUserId string221var presignedDeleteBucketCmd = &cobra.Command{222Use: "bucket <bucket>",223Short: "bucket",224Args: cobra.ExactArgs(1),225Example: "delete bucket gitpod-s3",226RunE: func(cmd *cobra.Command, args []string) error {227presigned, err := createPresignedAccess()228if err != nil {229return err230}231232if err = presigned.DeleteBucket(context.Background(), presignedDeleteBucketUserId, args[0]); err != nil {233return err234}235236return nil237},238}239240var presignedDeleteObjectCmd = &cobra.Command{241Use: "object <key>",242Short: "object",243Args: cobra.ExactArgs(1),244Example: "delete object test-owner/backup.tar",245RunE: func(cmd *cobra.Command, args []string) error {246presigned, err := createPresignedAccess()247if err != nil {248return err249}250251if err := presigned.DeleteObject(context.Background(), "", &storage.DeleteObjectQuery{Prefix: args[0]}); err != nil {252return err253}254255return nil256},257}258259func createDirectAccess() (direct storage.DirectAccess, err error) {260var cfg *config.StorageConfig261if options.config != "" {262cfg, err = getTestConfig(options.config)263if err != nil {264return nil, err265}266267} else {268cfg = &config.StorageConfig{269Kind: config.S3Storage,270S3Config: &config.S3Config{271Bucket: "gitpod-s3",272Region: "eu-central-1",273CredentialsFile: "./credentials",274},275}276}277278direct, err = storage.NewDirectAccess(cfg)279if err != nil {280return nil, err281}282283if err = direct.Init(context.TODO(), options.owner, options.workspace, options.instance); err != nil {284return nil, err285}286287ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)288defer cancel()289290if err = direct.EnsureExists(ctx); err != nil {291return nil, err292}293294return direct, nil295}296297func createPresignedAccess() (presigned storage.PresignedAccess, err error) {298var cfg *config.StorageConfig299if options.config != "" {300cfg, err = getTestConfig(options.config)301if err != nil {302return nil, err303}304305} else {306cfg = &config.StorageConfig{307Kind: config.S3Storage,308S3Config: &config.S3Config{309Bucket: "gitpod-s3",310Region: "eu-central-1",311CredentialsFile: "./credentials",312},313}314}315316presigned, err = storage.NewPresignedAccess(cfg)317if err != nil {318return nil, err319}320321ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)322defer cancel()323324if err = presigned.EnsureExists(ctx, cfg.S3Config.Bucket); err != nil {325return nil, err326}327328return presigned, nil329}330331func getTestConfig(path string) (*config.StorageConfig, error) {332ctnt, err := os.ReadFile(path)333if err != nil {334return nil, err335}336337var cfg config.StorageConfig338err = json.Unmarshal(ctnt, &cfg)339if err != nil {340return nil, err341}342343return &cfg, nil344}345346func init() {347// direct348directCmd.PersistentFlags().StringVar(&options.owner, "owner", "test-owner", "owner")349directCmd.PersistentFlags().StringVar(&options.workspace, "workspace", "test-workspace", "workspace")350directCmd.PersistentFlags().StringVar(&options.instance, "instance", "test-instance", "instance")351352directUploadCmd.PersistentFlags().StringVar(&uploadOpts.path, "path", "", "path of the file to be uploaded")353directUploadCmd.PersistentFlags().StringVar(&uploadOpts.name, "name", "", "name that will be used for the blob in object storage")354directUploadCmd.PersistentFlags().BoolVar(&uploadOpts.instance, "to-instance", false, "save to workspace or instance folder")355356directDownloadCmd.PersistentFlags().StringVar(&downloadOpts.destination, "dest", "", "destination of downloaded file")357directDownloadCmd.PersistentFlags().StringVar(&downloadOpts.name, "name", "", "name of the blob in S3")358359directCmd.AddCommand(directListCmd)360directCmd.AddCommand(directUploadCmd)361directCmd.AddCommand(directDownloadCmd)362363// presigned364presignedDeleteBucketCmd.PersistentFlags().StringVar(&presignedDeleteBucketUserId, "userId", "test-owner", "userId")365presignedDeleteCmd.AddCommand(presignedDeleteBucketCmd)366presignedDeleteCmd.AddCommand(presignedDeleteObjectCmd)367368presignedCmd.AddCommand(presignedUploadCmd)369presignedCmd.AddCommand(presignedDownloadCmd)370presignedCmd.AddCommand(presignedUsageCmd)371presignedCmd.AddCommand(presignedExistsCmd)372presignedCmd.AddCommand(presignedDeleteCmd)373374// test375testCmd.PersistentFlags().StringVar(&options.config, "config", "", "config path")376377testCmd.AddCommand(directCmd)378testCmd.AddCommand(presignedCmd)379380rootCmd.AddCommand(testCmd)381}382383384