Skip to content

OLM-2753: Semver veneer pipe support #376

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

Merged
merged 2 commits into from
Sep 7, 2022
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
19 changes: 18 additions & 1 deletion staging/operator-registry/alpha/veneer/semver/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,10 @@ In this example, `Candidate` has the entire version range of bundles, `Fast` ha
```
% ./bin/opm alpha render-veneer semver -h
Generate a file-based catalog from a single 'semver veneer' file
When FILE is '-' or not provided, the veneer is read from standard input

Usage:
opm alpha render-veneer semver <filename> [flags]
opm alpha render-veneer semver [FILE] [flags]

Flags:
-h, --help help for semver
Expand All @@ -68,6 +69,22 @@ Global Flags:
--skip-tls-verify skip TLS certificate verification for container image registries while pulling bundles
--use-http use plain HTTP for container image registries while pulling bundles
```

Example command usage:
```
# Example with file argument passed in
opm alpha render-veneer semver infile.semver.veneer.yaml

# Example with no file argument passed in
opm alpha render-veneer semver -o yaml < infile.semver.veneer.yaml > outfile.yaml

# Example with "-" as the file argument passed in
cat infile.semver.veneer.yaml | opm alpha render-veneer semver -o mermaid -
```
Note that if the command is called without a file argument and nothing passed in on standard input,
the command will hang indefinitely. Either a file argument or file information passed
in on standard input is required by the command.

With the veneer attribute `GenerateMajorChannels: true` resulting major channels from the command are (skipping the rendered bundle image output):
```yaml
---
Expand Down
16 changes: 8 additions & 8 deletions staging/operator-registry/alpha/veneer/semver/semver.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package semver
import (
"context"
"fmt"
"io/ioutil"
"io"
"sort"

"github.com/blang/semver/v4"
Expand All @@ -18,8 +18,8 @@ import (

// data passed into this module externally
type Veneer struct {
Ref string
Reg image.Registry
Data io.Reader
Registry image.Registry
}

// IO structs -- BEGIN
Expand Down Expand Up @@ -78,7 +78,7 @@ type semverRenderedChannelVersions map[string]map[string]semver.Version // e.g.
func (v Veneer) Render(ctx context.Context) (*declcfg.DeclarativeConfig, error) {
var out declcfg.DeclarativeConfig

sv, err := readFile(v.Ref)
sv, err := readFile(v.Data)
if err != nil {
return nil, fmt.Errorf("semver-render: unable to read file: %v", err)
}
Expand All @@ -88,7 +88,7 @@ func (v Veneer) Render(ctx context.Context) (*declcfg.DeclarativeConfig, error)
r := action.Render{
AllowedRefMask: action.RefBundleImage,
Refs: []string{b.Image},
Registry: v.Reg,
Registry: v.Registry,
}
c, err := r.Run(ctx)
if err != nil {
Expand All @@ -114,8 +114,8 @@ func (v Veneer) Render(ctx context.Context) (*declcfg.DeclarativeConfig, error)
return &out, nil
}

func readFile(ref string) (*semverVeneer, error) {
data, err := ioutil.ReadFile(ref)
func readFile(data io.Reader) (*semverVeneer, error) {
fileData, err := io.ReadAll(data)
if err != nil {
return nil, err
}
Expand All @@ -126,7 +126,7 @@ func readFile(ref string) (*semverVeneer, error) {
GenerateMinorChannels: true,
AvoidSkipPatch: false,
}
if err := yaml.Unmarshal(data, &sv); err != nil {
if err := yaml.Unmarshal(fileData, &sv); err != nil {
return nil, err
}
return &sv, nil
Expand Down
34 changes: 22 additions & 12 deletions staging/operator-registry/cmd/opm/alpha/veneer/semver.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,19 @@ import (
func newSemverCmd() *cobra.Command {
output := ""
cmd := &cobra.Command{
Use: "semver <filename>",
Short: "Generate a file-based catalog from a single 'semver veneer' file",
Long: `Generate a file-based catalog from a single 'semver veneer' file`,
Args: cobra.MinimumNArgs(1),
Use: "semver [FILE]",
Short: "Generate a file-based catalog from a single 'semver veneer' file \nWhen FILE is '-' or not provided, the veneer is read from standard input",
Long: "Generate a file-based catalog from a single 'semver veneer' file \nWhen FILE is '-' or not provided, the veneer is read from standard input",
Args: cobra.MaximumNArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
ref := args[0]

var (
err error
)
// Handle different input argument types
// When no arguments or "-" is passed to the command,
// assume input is coming from stdin
// Otherwise open the file passed to the command
data, err := openFileOrReadStdin(cmd, args)
if err != nil {
return err
}

var write func(declcfg.DeclarativeConfig, io.Writer) error
switch output {
Expand All @@ -53,12 +56,12 @@ func newSemverCmd() *cobra.Command {
defer reg.Destroy()

veneer := semver.Veneer{
Ref: ref,
Reg: reg,
Data: data,
Registry: reg,
}
out, err := veneer.Render(cmd.Context())
if err != nil {
log.Fatalf("semver %q: %v", ref, err)
log.Fatalf("semver %q: %v", data, err)
}

if out != nil {
Expand All @@ -74,3 +77,10 @@ func newSemverCmd() *cobra.Command {
cmd.Flags().StringVarP(&output, "output", "o", "json", "Output format (json|yaml|mermaid)")
return cmd
}

func openFileOrReadStdin(cmd *cobra.Command, args []string) (io.Reader, error) {
if len(args) == 0 || args[0] == "-" {
return cmd.InOrStdin(), nil
}
return os.Open(args[0])
}

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

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

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