Skip to content

Commit

Permalink
crane: add serve subcommand (#1586)
Browse files Browse the repository at this point in the history
  • Loading branch information
imjasonh authored Mar 9, 2023
1 parent 57f010d commit ff810c1
Show file tree
Hide file tree
Showing 9 changed files with 163 additions and 799 deletions.
2 changes: 1 addition & 1 deletion .golangci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ issues:
linters:
enable:
- asciicheck
- deadcode
- depguard
- errorlint
- gofmt
Expand All @@ -28,6 +27,7 @@ linters:
- tparallel
- unconvert
- unparam
- unused
- whitespace

disable:
Expand Down
7 changes: 3 additions & 4 deletions cmd/crane/cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ func New(use, short string, options []crane.Option) *cobra.Command {
},
}

commands := []*cobra.Command{
root.AddCommand(
NewCmdAppend(&options),
NewCmdAuth(options, "crane", "auth"),
NewCmdBlob(&options),
Expand All @@ -117,9 +117,8 @@ func New(use, short string, options []crane.Option) *cobra.Command {
NewCmdTag(&options),
NewCmdValidate(&options),
NewCmdVersion(),
}

root.AddCommand(commands...)
newCmdRegistry(),
)

root.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "Enable debug logs")
root.PersistentFlags().BoolVar(&insecure, "insecure", false, "Allow image references to be fetched without TLS")
Expand Down
84 changes: 84 additions & 0 deletions cmd/crane/cmd/serve.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
// Copyright 2023 Google LLC All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package cmd

import (
"errors"
"fmt"
"log"
"net"
"net/http"
"os"
"time"

"github.com/spf13/cobra"

"github.com/google/go-containerregistry/pkg/registry"
)

func newCmdRegistry() *cobra.Command {
cmd := &cobra.Command{
Use: "registry",
}
cmd.AddCommand(newCmdServe())
return cmd
}

func newCmdServe() *cobra.Command {
return &cobra.Command{
Use: "serve",
Short: "Serve an in-memory registry implementation",
Long: `This sub-command serves an in-memory registry implementation on port :8080 (or $PORT)
The command blocks while the server accepts pushes and pulls.
Contents are only stored in memory, and when the process exits, pushed data is lost.`,
Args: cobra.NoArgs,
RunE: func(cmd *cobra.Command, _ []string) error {
ctx := cmd.Context()

port := os.Getenv("PORT")
if port == "" {
port = "0"
}
listener, err := net.Listen("tcp", "localhost:"+port)
if err != nil {
log.Fatalln(err)
}
porti := listener.Addr().(*net.TCPAddr).Port
port = fmt.Sprintf("%d", porti)

s := &http.Server{
ReadHeaderTimeout: 5 * time.Second, // prevent slowloris, quiet linter
Handler: registry.New(),
}
log.Printf("serving on port %s", port)

errCh := make(chan error)
go func() { errCh <- s.Serve(listener) }()

<-ctx.Done()
log.Println("shutting down...")
if err := s.Shutdown(ctx); err != nil {
return err
}

if err := <-errCh; !errors.Is(err, http.ErrServerClosed) {
return err
}
return nil
},
}
}
1 change: 1 addition & 0 deletions cmd/crane/doc/crane.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

24 changes: 24 additions & 0 deletions cmd/crane/doc/crane_registry.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

35 changes: 35 additions & 0 deletions cmd/crane/doc/crane_registry_serve.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit ff810c1

Please sign in to comment.