Skip to content

Commit

Permalink
Merge pull request #15 from nao1215/feat/s3hub-ls-s3key
Browse files Browse the repository at this point in the history
Add feature that list up S3 Objects
  • Loading branch information
nao1215 authored Jan 1, 2024
2 parents b2e2caf + 2f27f2c commit 0b147db
Show file tree
Hide file tree
Showing 6 changed files with 157 additions and 11 deletions.
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{
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

0 comments on commit 0b147db

Please sign in to comment.