Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add feature that list up S3 Objects #15

Merged
merged 3 commits into from
Jan 1, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ build: ## Build binary
env GO111MODULE=on GOOS=$(GOOS) GOARCH=$(GOARCH) $(GO_BUILD) $(GO_LDFLAGS) -o $(S3HUB) cmd/s3hub/main.go
env GO111MODULE=on GOOS=$(GOOS) GOARCH=$(GOARCH) $(GO_BUILD) $(GO_LDFLAGS) -o $(SPARE) cmd/spare/main.go


clean: ## Clean project
-rm -rf $(S3HUB) $(SPARE) cover.out cover.html

Expand All @@ -42,6 +41,7 @@ generate: ## Generate code from templates
gif: docker ## Generate gif image
vhs < doc/img/vhs/s3hub-mb.tape
vhs < doc/img/vhs/s3hub-ls.tape
vhs < doc/img/vhs/s3hub-ls.tape
vhs < doc/img/vhs/s3hub-rm-all.tape

docker: ## Start docker (localstack)
Expand Down
10 changes: 10 additions & 0 deletions app/domain/model/s3.go
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,16 @@ func (s S3ObjectIdentifierSets) Len() int {
return len(s)
}

// Less defines the ordering of S3ObjectIdentifier instances.
func (s S3ObjectIdentifierSets) Less(i, j int) bool {
return s[i].S3Key < s[j].S3Key
}

// Swap swaps the elements with indexes i and j.
func (s S3ObjectIdentifierSets) Swap(i, j int) {
s[i], s[j] = s[j], s[i]
}

// ToS3ObjectIdentifiers converts the S3ObjectSets to the ObjectIdentifiers.
func (s S3ObjectIdentifierSets) ToS3ObjectIdentifiers() []types.ObjectIdentifier {
ids := make([]types.ObjectIdentifier, 0, s.Len())
Expand Down
69 changes: 68 additions & 1 deletion cmd/subcmd/s3hub/ls.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package s3hub

import (
"errors"
"fmt"
"sort"

"github.com/fatih/color"
"github.com/nao1215/rainbow/app/domain/model"
"github.com/nao1215/rainbow/app/usecase"
Expand Down Expand Up @@ -30,19 +34,48 @@ type lsCmd struct {
*s3hub
// bucket is the name of the bucket.
bucket model.Bucket
// lsMode is the mode for listing.
mode lsMode
}

// lsMode is the mode for listing.
type lsMode int

const (
// lsModeBucket is the mode for listing buckets.
lsModeBucket lsMode = 0
// lsModeObject is the mode for listing objects.
lsModeObject lsMode = 1
)

// Parse parses command line arguments.
func (l *lsCmd) Parse(cmd *cobra.Command, args []string) error {
if len(args) >= 1 {
l.bucket = model.Bucket(args[0])
l.bucket = model.NewBucketWithoutProtocol(args[0])
}

if !l.bucket.Empty() {
l.mode = lsModeObject
l.bucket, _ = l.bucket.Split()
}

l.s3hub = newS3hub()
return l.s3hub.parse(cmd)
}

func (l *lsCmd) Do() error {
switch l.mode {
case lsModeBucket:
return l.printBucket()
case lsModeObject:
return l.printObject()
default:
return errors.New("invalid mode: please report this bug: https://github.com/nao1215/rainbow")
}
}

// printBucket prints buckets.
func (l *lsCmd) printBucket() error {
out, err := l.s3hub.S3BucketLister.ListS3Buckets(l.ctx, &usecase.S3BucketListerInput{})
if err != nil {
return err
Expand All @@ -61,3 +94,37 @@ func (l *lsCmd) Do() error {
}
return nil
}

// printObject prints objects.
func (l *lsCmd) printObject() error {
listBuckets, err := l.s3hub.S3BucketLister.ListS3Buckets(l.ctx, &usecase.S3BucketListerInput{})
if err != nil {
return err
}
if !listBuckets.Buckets.Contains(l.bucket) {
return fmt.Errorf("bucket not found: %s", color.YellowString("%s", l.bucket))
}

listS3Objects, err := l.s3hub.S3BucketObjectsLister.ListS3BucketObjects(l.ctx, &usecase.S3BucketObjectsListerInput{
nao1215 marked this conversation as resolved.
Show resolved Hide resolved
Bucket: l.bucket,
})
if err != nil {
return err
}

l.printf("[S3Objects (profile=%s)]\n", l.profile.String())
if len(listS3Objects.Objects) == 0 {
l.printf(" No S3 Objects\n")
return nil
}

sort.Sort(listS3Objects.Objects)
for _, o := range listS3Objects.Objects {
if o.VersionID == "" {
l.printf(" %s/%s\n", l.bucket, o.S3Key)
continue
}
l.printf(" %s/%s (version id=%s)\n", l.bucket, o.S3Key, o.VersionID)
}
return nil
}
Binary file added doc/img/s3hub-ls-objects.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
69 changes: 69 additions & 0 deletions doc/img/vhs/s3hub-ls-objects.tape
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# VHS documentation
#
# Output:
# Output <path>.gif Create a GIF output at the given <path>
# Output <path>.mp4 Create an MP4 output at the given <path>
# Output <path>.webm Create a WebM output at the given <path>
#
# Require:
# Require <string> Ensure a program is on the $PATH to proceed
#
# Settings:
# Set FontSize <number> Set the font size of the terminal
# Set FontFamily <string> Set the font family of the terminal
# Set Height <number> Set the height of the terminal
# Set Width <number> Set the width of the terminal
# Set LetterSpacing <float> Set the font letter spacing (tracking)
# Set LineHeight <float> Set the font line height
# Set LoopOffset <float>% Set the starting frame offset for the GIF loop
# Set Theme <json|string> Set the theme of the terminal
# Set Padding <number> Set the padding of the terminal
# Set Framerate <number> Set the framerate of the recording
# Set PlaybackSpeed <float> Set the playback speed of the recording
# Set MarginFill <file|#000000> Set the file or color the margin will be filled with.
# Set Margin <number> Set the size of the margin. Has no effect if MarginFill isn't set.
# Set BorderRadius <number> Set terminal border radius, in pixels.
# Set WindowBar <string> Set window bar type. (one of: Rings, RingsRight, Colorful, ColorfulRight)
# Set WindowBarSize <number> Set window bar size, in pixels. Default is 40.
# Set TypingSpeed <time> Set the typing speed of the terminal. Default is 50ms.
#
# Sleep:
# Sleep <time> Sleep for a set amount of <time> in seconds
#
# Type:
# Type[@<time>] "<characters>" Type <characters> into the terminal with a
# <time> delay between each character
#
# Keys:
# Escape[@<time>] [number] Press the Escape key
# Backspace[@<time>] [number] Press the Backspace key
# Delete[@<time>] [number] Press the Delete key
# Insert[@<time>] [number] Press the Insert key
# Down[@<time>] [number] Press the Down key
# Enter[@<time>] [number] Press the Enter key
# Space[@<time>] [number] Press the Space key
# Tab[@<time>] [number] Press the Tab key
# Left[@<time>] [number] Press the Left Arrow key
# Right[@<time>] [number] Press the Right Arrow key
# Up[@<time>] [number] Press the Up Arrow key
# Down[@<time>] [number] Press the Down Arrow key
# PageUp[@<time>] [number] Press the Page Up key
# PageDown[@<time>] [number] Press the Page Down key
# Ctrl+<key> Press the Control key + <key> (e.g. Ctrl+C)
#
# Display:
# Hide Hide the subsequent commands from the output
# Show Show the subsequent commands in the output

Output doc/img/s3hub-ls-objects.gif

Require s3hub

Set Shell "bash"
Set FontSize 26
Set Width 1500
Set Height 800

Type "export AWS_PROFILE=localstack" Sleep 200ms Enter
Type "s3hub ls test-bucket-on-localstack" Sleep 500ms Enter
Sleep 5s
18 changes: 9 additions & 9 deletions doc/s3hub/README.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
## s3hub - user-friendly s3 management tool
## s3hub - user-friendly S3 management tool
The s3hub command provides following features:
- [x] Create a bucket
- [x] List buckets
- [ ] List contents of a bucket
- [ ] Copy files to a bucket
- [x] Delete contents from a bucket
- [x] Delete a bucket
- [x] Create a S3 bucket
- [x] List S3 buckets
- [x] List S3 objects in the S3 bucket
- [ ] Copy files to S3 bucket
- [x] Delete contents from the S3 bucket
- [x] Delete the S3 bucket
- [ ] Interactive mode

## How to install
Expand Down Expand Up @@ -37,8 +37,8 @@ s3hub ls
s3hub ls ${YOUR_BUCKET_NAME}
```

> [!IMPORTANT]
> Not implemented yet.
![ls_bucket_objects](../img/s3hub-ls-objects.gif)


### Copy files to a bucket
From local to S3:
Expand Down
Loading