diff --git a/cmd/connector/customizer.go b/cmd/connector/customizer.go index b1f999b..a879428 100644 --- a/cmd/connector/customizer.go +++ b/cmd/connector/customizer.go @@ -23,6 +23,7 @@ func newConnCustomizersCmd(client client.Client) *cobra.Command { newCustomizerGetCmd(client), newCustomizerUpdateCmd(client), newCustomizerDeleteCmd(client), + newCustomizerCreateVersionCmd(client), ) return cmd diff --git a/cmd/connector/customizer_create_version.go b/cmd/connector/customizer_create_version.go new file mode 100644 index 0000000..3a362aa --- /dev/null +++ b/cmd/connector/customizer_create_version.go @@ -0,0 +1,83 @@ +// Copyright (c) 2023, SailPoint Technologies, Inc. All rights reserved. +package connector + +import ( + "archive/zip" + "encoding/json" + "fmt" + "io" + "net/http" + "os" + + "github.com/olekukonko/tablewriter" + "github.com/sailpoint-oss/sailpoint-cli/internal/client" + "github.com/sailpoint-oss/sailpoint-cli/internal/util" + "github.com/spf13/cobra" +) + +func newCustomizerCreateVersionCmd(client client.Client) *cobra.Command { + cmd := &cobra.Command{ + Use: "upload", + Short: "Upload connector customizer", + Example: "sail conn customizers upload -c 1234 -f path/to/zip/archive.zip", + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, args []string) error { + id := cmd.Flags().Lookup("id").Value.String() + archivePath := cmd.Flags().Lookup("file").Value.String() + + f, err := os.Open(archivePath) + if err != nil { + return err + } + + info, err := f.Stat() + if err != nil { + return err + } + + _, err = zip.NewReader(f, info.Size()) + if err != nil { + return err + } + + _, err = f.Seek(0, io.SeekStart) + if err != nil { + return err + } + + resp, err := client.Post(cmd.Context(), util.ResourceUrl(connectorCustomizersEndpoint, id, "versions"), "application/zip", f) + if err != nil { + return err + } + defer func(Body io.ReadCloser) { + _ = Body.Close() + }(resp.Body) + + if resp.StatusCode != http.StatusOK { + body, _ := io.ReadAll(resp.Body) + return fmt.Errorf("upload customizer failed. status: %s\nbody: %s", resp.Status, string(body)) + } + + var cv customizerVersion + err = json.NewDecoder(resp.Body).Decode(&cv) + if err != nil { + return err + } + + table := tablewriter.NewWriter(cmd.OutOrStdout()) + table.SetHeader(customizerVersionColumns) + table.Append(cv.columns()) + table.Render() + + return nil + }, + } + + cmd.Flags().StringP("id", "c", "", "Connector customizer ID") + _ = cmd.MarkFlagRequired("id") + + cmd.Flags().StringP("file", "f", "", "ZIP Archive") + _ = cmd.MarkFlagRequired("file") + + return cmd +} diff --git a/cmd/connector/customizer_delete.go b/cmd/connector/customizer_delete.go index 2aa0085..3609bbe 100644 --- a/cmd/connector/customizer_delete.go +++ b/cmd/connector/customizer_delete.go @@ -39,7 +39,7 @@ func newCustomizerDeleteCmd(client client.Client) *cobra.Command { }, } - cmd.Flags().StringP("id", "c", "", "Connector ID or Alias") + cmd.Flags().StringP("id", "c", "", "Connector customizer ID") _ = cmd.MarkFlagRequired("id") return cmd diff --git a/cmd/connector/customizer_get.go b/cmd/connector/customizer_get.go index 4f7f2b9..8bd670e 100644 --- a/cmd/connector/customizer_get.go +++ b/cmd/connector/customizer_get.go @@ -50,7 +50,7 @@ func newCustomizerGetCmd(client client.Client) *cobra.Command { }, } - cmd.Flags().StringP("id", "c", "", "Connector ID or Alias") + cmd.Flags().StringP("id", "c", "", "Connector customizer ID") _ = cmd.MarkFlagRequired("id") return cmd diff --git a/cmd/connector/customizer_list.go b/cmd/connector/customizer_list.go index a7da853..bf47a86 100644 --- a/cmd/connector/customizer_list.go +++ b/cmd/connector/customizer_list.go @@ -39,17 +39,6 @@ func newCustomizerListCmd(client client.Client) *cobra.Command { return err } - // raw, err := io.ReadAll(resp.Body) - // if err != nil { - // return err - // } - - // var tags []tag - // err = json.Unmarshal(raw, &tags) - // if err != nil { - // return err - // } - table := tablewriter.NewWriter(cmd.OutOrStdout()) table.SetHeader(customizerColumns) for _, c := range customizers { diff --git a/cmd/connector/customizer_update.go b/cmd/connector/customizer_update.go index 26cbc65..0c10274 100644 --- a/cmd/connector/customizer_update.go +++ b/cmd/connector/customizer_update.go @@ -58,7 +58,7 @@ func newCustomizerUpdateCmd(client client.Client) *cobra.Command { }, } - cmd.Flags().StringP("id", "c", "", "Specify connector customizer id") + cmd.Flags().StringP("id", "c", "", "Connector customizer ID") _ = cmd.MarkFlagRequired("id") cmd.Flags().StringP("name", "n", "", "name of the connector customizer") diff --git a/cmd/connector/models.go b/cmd/connector/models.go index 03e6908..470a54b 100644 --- a/cmd/connector/models.go +++ b/cmd/connector/models.go @@ -68,3 +68,15 @@ func (c customizer) columns() []string { } var customizerColumns = []string{"ID", "Name", "Version"} + +type customizerVersion struct { + CustomizerID string `json:"connectorCustomizerId"` + ImageID string `json:"imageId"` + Version int `json:"version"` +} + +func (c customizerVersion) columns() []string { + return []string{c.CustomizerID, c.ImageID, strconv.Itoa(c.Version)} +} + +var customizerVersionColumns = []string{"Customizer ID", "Image ID", "Version"}