Skip to content
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
69 changes: 64 additions & 5 deletions cli/cmd/release_create.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,24 @@
package cmd

import (
"encoding/json"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"strings"

"github.com/pkg/errors"
"github.com/spf13/cobra"
)

type kotsSingleSpec struct {
Name string `json:"name"`
Path string `json:"path"`
Content string `json:"content"`
Children []string `json:"children"`
}

func (r *runners) InitReleaseCreate(parent *cobra.Command) {
cmd := &cobra.Command{
Use: "create",
Expand All @@ -19,6 +31,7 @@ func (r *runners) InitReleaseCreate(parent *cobra.Command) {

cmd.Flags().StringVar(&r.args.createReleaseYaml, "yaml", "", "The YAML config for this release. Use '-' to read from stdin. Cannot be used with the `yaml-file` falg.")
cmd.Flags().StringVar(&r.args.createReleaseYamlFile, "yaml-file", "", "The file name with YAML config for this release. Cannot be used with the `yaml` flag.")
cmd.Flags().StringVar(&r.args.createReleaseYamlDir, "yaml-dir", "", "The directory containing multiple yamls for a Kots release. Cannot be used with the `yaml` flag.")
cmd.Flags().StringVar(&r.args.createReleasePromote, "promote", "", "Channel name or id to promote this release to")
cmd.Flags().StringVar(&r.args.createReleasePromoteNotes, "release-notes", "", "When used with --promote <channel>, sets the **markdown** release notes")
cmd.Flags().BoolVar(&r.args.createReleasePromoteRequired, "required", false, "When used with --promote <channel>, marks this release as required during upgrades.")
Expand All @@ -28,30 +41,76 @@ func (r *runners) InitReleaseCreate(parent *cobra.Command) {
}

func (r *runners) releaseCreate(cmd *cobra.Command, args []string) error {
if r.args.createReleaseYaml == "" && r.args.createReleaseYamlFile == "" {
return fmt.Errorf("yaml is required")
if r.args.createReleaseYaml == "" && r.args.createReleaseYamlFile == "" && r.args.createReleaseYamlDir == "" {
return errors.New("yaml is required")
}

if r.args.createReleaseYaml != "" && r.args.createReleaseYamlFile != "" {
return fmt.Errorf("only one of yaml or yaml-file may be specified")
return errors.New("only one of yaml or yaml-file may be specified")
}

if r.args.createReleaseYaml == "-" {
bytes, err := ioutil.ReadAll(r.stdin)
if err != nil {
return err
return errors.Wrap(err, "read from stdin")
}
r.args.createReleaseYaml = string(bytes)
}

if r.args.createReleaseYamlFile != "" {
bytes, err := ioutil.ReadFile(r.args.createReleaseYamlFile)
if err != nil {
return err
return errors.Wrap(err, "read file yaml")
}
r.args.createReleaseYaml = string(bytes)
}

if r.args.createReleaseYamlDir != "" {
var allKotsReleaseSpecs []kotsSingleSpec
err := filepath.Walk(r.args.createReleaseYamlDir, func(path string, info os.FileInfo, err error) error {

singlefile := strings.TrimPrefix(path, r.args.createReleaseYamlDir)

if err != nil {
return errors.Wrapf(err, "walk %s", info.Name())
}

if info.IsDir() {
return nil
}
if strings.HasPrefix(info.Name(), ".") {
return nil
}
ext := filepath.Ext(info.Name())
if ext != ".yaml" && ext != ".yml" {
return nil
}

bytes, err := ioutil.ReadFile(path)
if err != nil {
return errors.Wrapf(err, "read file %s", path)
}

spec := kotsSingleSpec{
Name: info.Name(),
Path: singlefile,
Content: string(bytes),
Children: []string{},
}
allKotsReleaseSpecs = append(allKotsReleaseSpecs, spec)
return nil
})
if err != nil {
return errors.Wrapf(err, "walk %s", r.args.createReleaseYamlDir)
}

jsonAllYamls, err := json.Marshal(allKotsReleaseSpecs)
if err != nil {
return errors.Wrap(err, "marshal spec")
}
r.args.createReleaseYaml = string(jsonAllYamls)
}

// if the --promote param was used make sure it identifies exactly one
// channel before proceeding
var promoteChanID string
Expand Down
56 changes: 53 additions & 3 deletions cli/cmd/release_update.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package cmd

import (
"errors"
"encoding/json"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"strconv"
"strings"

"github.com/pkg/errors"
"github.com/spf13/cobra"
)

Expand All @@ -20,12 +24,13 @@ func (r *runners) InitReleaseUpdate(parent *cobra.Command) {

cmd.Flags().StringVar(&r.args.updateReleaseYaml, "yaml", "", "The new YAML config for this release. Use '-' to read from stdin. Cannot be used with the `yaml-file` flag.")
cmd.Flags().StringVar(&r.args.updateReleaseYamlFile, "yaml-file", "", "The file name with YAML config for this release. Cannot be used with the `yaml` flag.")
cmd.Flags().StringVar(&r.args.updateReleaseYamlDir, "yaml-dir", "", "The directory containing multiple yamls for a Kots release. Cannot be used with the `yaml` flag.")

cmd.RunE = r.releaseUpdate
}

func (r *runners) releaseUpdate(cmd *cobra.Command, args []string) error {
if r.args.updateReleaseYaml == "" && r.args.updateReleaseYamlFile == "" {
if r.args.updateReleaseYaml == "" && r.args.updateReleaseYamlFile == "" && r.args.updateReleaseYamlDir == "" {
return fmt.Errorf("yaml is required")
}

Expand Down Expand Up @@ -57,7 +62,52 @@ func (r *runners) releaseUpdate(cmd *cobra.Command, args []string) error {
return fmt.Errorf("invalid release sequence: %s", args[0])
}

if err := r.platformAPI.UpdateRelease(r.appID, seq, r.args.updateReleaseYaml); err != nil {
if r.args.updateReleaseYamlDir != "" {
var allKotsReleaseSpecs []kotsSingleSpec
err := filepath.Walk(r.args.updateReleaseYamlDir, func(path string, info os.FileInfo, err error) error {

singlefile := strings.TrimPrefix(path, r.args.updateReleaseYamlDir)

if err != nil {
return errors.Wrapf(err, "walk %s", info.Name())
}

if info.IsDir() {
return nil
}
if strings.HasPrefix(info.Name(), ".") {
return nil
}
ext := filepath.Ext(info.Name())
if ext != ".yaml" && ext != ".yml" {
return nil
}

bytes, err := ioutil.ReadFile(path)
if err != nil {
return errors.Wrapf(err, "read file %s", path)
}

spec := kotsSingleSpec{
Name: info.Name(),
Path: singlefile,
Content: string(bytes),
Children: []string{},
}
allKotsReleaseSpecs = append(allKotsReleaseSpecs, spec)
return nil
})
if err != nil {
return errors.Wrapf(err, "walk %s", r.args.updateReleaseYamlDir)
}

jsonAllYamls, err := json.Marshal(allKotsReleaseSpecs)
if err != nil {
return errors.Wrap(err, "marshal spec")
}
r.args.updateReleaseYaml = string(jsonAllYamls)
}
if err := r.api.UpdateRelease(r.appID, seq, r.args.updateReleaseYaml); err != nil {
return fmt.Errorf("Failure setting new yaml config for release: %v", err)
}

Expand Down
10 changes: 10 additions & 0 deletions cli/cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"os"
"text/tabwriter"

"github.com/replicatedhq/replicated/pkg/kotsclient"
"github.com/replicatedhq/replicated/pkg/shipclient"

"github.com/replicatedhq/replicated/client"
Expand Down Expand Up @@ -151,6 +152,9 @@ func Execute(rootCmd *cobra.Command, stdin io.Reader, stdout io.Writer, stderr i
shipAPI := shipclient.NewGraphQLClient(graphqlOrigin, apiToken)
runCmds.shipAPI = shipAPI

kotsAPI := kotsclient.NewGraphQLClient(graphqlOrigin, apiToken)
runCmds.kotsAPI = kotsAPI

commonAPI := client.NewClient(platformOrigin, graphqlOrigin, apiToken)
runCmds.api = commonAPI

Expand All @@ -176,6 +180,12 @@ func Execute(rootCmd *cobra.Command, stdin io.Reader, stdout io.Writer, stderr i
return err
}
runCmds.appID = app.ID
} else if appType == "kots" {
app, err := kotsAPI.GetApp(appSlugOrID)
if err != nil {
return err
}
runCmds.appID = app.ID
}

return nil
Expand Down
38 changes: 25 additions & 13 deletions cli/cmd/runner.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import (
"io"
"text/tabwriter"

"github.com/replicatedhq/replicated/pkg/kotsclient"

"github.com/replicatedhq/replicated/pkg/shipclient"
"github.com/spf13/cobra"

Expand All @@ -19,7 +21,9 @@ type runners struct {
api client.Client
platformAPI platformclient.Client
shipAPI shipclient.Client
kotsAPI kotsclient.Client
stdin io.Reader
dir string
w *tabwriter.Writer

rootCmd *cobra.Command
Expand All @@ -37,19 +41,27 @@ type runnerArgs struct {
updateCollectorYamlFile string
updateCollectorName string

createReleaseYaml string
createReleaseYamlFile string
createReleasePromote string
createReleasePromoteRequired bool
createReleasePromoteNotes string
createReleasePromoteVersion string
lintReleaseYaml string
lintReleaseYamlFile string
releaseOptional bool
releaseNotes string
releaseVersion string
updateReleaseYaml string
updateReleaseYamlFile string
createReleaseYaml string
createReleaseYamlFile string
createReleaseYamlDir string
createReleaseConfigYaml string
createReleaseDeploymentYaml string
createReleaseServiceYaml string
createReleasePreflightYaml string
createReleaseSupportBundleYaml string
createReleasePromote string
createReleasePromoteDir string
createReleasePromoteRequired bool
createReleasePromoteNotes string
createReleasePromoteVersion string
lintReleaseYaml string
lintReleaseYamlFile string
releaseOptional bool
releaseNotes string
releaseVersion string
updateReleaseYaml string
updateReleaseYamlDir string
updateReleaseYamlFile string

entitlementsAPIServer string
entitlementsVerbose bool
Expand Down
1 change: 0 additions & 1 deletion client/channel.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,5 @@ func (c *Client) CreateChannel(appID string, name string, description string) ([
}
return c.ShipClient.ListChannels(appID)
}

return nil, errors.New("unknown app type")
}
8 changes: 8 additions & 0 deletions client/client.go
Original file line number Diff line number Diff line change
@@ -1,19 +1,22 @@
package client

import (
"github.com/replicatedhq/replicated/pkg/kotsclient"
"github.com/replicatedhq/replicated/pkg/platformclient"
"github.com/replicatedhq/replicated/pkg/shipclient"
)

type Client struct {
PlatformClient platformclient.Client
ShipClient shipclient.Client
KotsClient kotsclient.Client
}

func NewClient(platformOrigin string, graphqlOrigin string, apiToken string) Client {
client := Client{
PlatformClient: platformclient.NewHTTPClient(platformOrigin, apiToken),
ShipClient: shipclient.NewGraphQLClient(graphqlOrigin, apiToken),
KotsClient: kotsclient.NewGraphQLClient(graphqlOrigin, apiToken),
}

return client
Expand All @@ -30,5 +33,10 @@ func (c *Client) GetAppType(appID string) (string, error) {
return "ship", nil
}

kotsApp, err := c.KotsClient.GetApp(appID)
if err == nil && kotsApp != nil {
return "kots", nil
}

return "", err
}
1 change: 1 addition & 0 deletions client/collector.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ func (c *Client) UpdateCollector(appID string, specID string, yaml string) (inte
}

func (c *Client) UpdateCollectorName(appID string, specID string, name string) (interface{}, error) {

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

extra newline

return c.ShipClient.UpdateCollectorName(appID, specID, name)

}
Expand Down
Loading