diff --git a/CHANGELOG.md b/CHANGELOG.md index 793609341..7727c8303 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ Some features listed in this changelog, like databases next generation, are currently only available in preview to selected users. +* feat(projects): add command to get project and private network information * fix(privatenetworks): default format should be `table` * feat(databases next generation): create all commands to handle next generation `databases`. * feat(databases next generation): add the support of `--database` flag for several commands: diff --git a/README.md b/README.md index aecb27cc7..05493f519 100644 --- a/README.md +++ b/README.md @@ -224,7 +224,8 @@ COMMANDS: projects-add Create a project projects-update Update a project projects-remove Remove a project - + projects-details Get details about a project + Public SSH Keys: keys List your SSH public keys keys-add Add a public SSH key to deploy your apps diff --git a/cmd/commands.go b/cmd/commands.go index fecf1b4c4..b749af54c 100644 --- a/cmd/commands.go +++ b/cmd/commands.go @@ -308,6 +308,7 @@ var ( &projectsAddCommand, &projectsUpdateCommand, &projectsRemoveCommand, + &projectsDetailsCommand, // Private Networks &privateNetworksApplicationDomainsListCommand, diff --git a/cmd/projects.go b/cmd/projects.go index 3da76dbfb..e1635e4a2 100644 --- a/cmd/projects.go +++ b/cmd/projects.go @@ -139,4 +139,32 @@ var ( _ = autocomplete.ProjectsGenericListAutoComplete(ctx) }, } + + projectsDetailsCommand = cli.Command{ + Name: "projects-details", + Category: "Projects", + Usage: "Get details about a project", + ArgsUsage: "project-id", + Description: CommandDescription{ + Description: "Get details about a project", + Examples: []string{"scalingo projects-details prj-00000000-0000-0000-0000-000000000000"}, + }.Render(), + Action: func(ctx context.Context, c *cli.Command) error { + projectID := c.Args().First() + if projectID == "" { + errorQuitWithHelpMessage(ctx, errors.New(ctx, "missing project ID parameter"), c, "projects-details") + } + + err := projects.Get(ctx, projectID) + if err != nil { + errorQuit(ctx, err) + } + + return nil + }, + ShellComplete: func(ctx context.Context, c *cli.Command) { + _ = autocomplete.CmdFlagsAutoComplete(c, "projects-details") + _ = autocomplete.ProjectsGenericListAutoComplete(ctx) + }, + } ) diff --git a/go.mod b/go.mod index 3f7b79c53..e9986287c 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.24.0 require ( github.com/AlecAivazis/survey/v2 v2.3.7 - github.com/Scalingo/go-scalingo/v8 v8.7.1 + github.com/Scalingo/go-scalingo/v8 v8.8.0 github.com/Scalingo/go-utils/errors/v2 v2.5.1 github.com/Scalingo/go-utils/logger v1.11.0 github.com/Scalingo/gopassword v1.1.0 diff --git a/go.sum b/go.sum index b8d4314fe..b0c818cae 100644 --- a/go.sum +++ b/go.sum @@ -9,8 +9,8 @@ github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63n github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= github.com/ProtonMail/go-crypto v1.3.0 h1:ILq8+Sf5If5DCpHQp4PbZdS1J7HDFRXz/+xKBiRGFrw= github.com/ProtonMail/go-crypto v1.3.0/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE= -github.com/Scalingo/go-scalingo/v8 v8.7.1 h1:Sqos+T77pVBR6iTQenG/7yafQoWMCNurBtdQD8Vg+MQ= -github.com/Scalingo/go-scalingo/v8 v8.7.1/go.mod h1:C87ufsz8H4/tUutK6cAmUaLpM4HwV8QOGAyfZyRgFAA= +github.com/Scalingo/go-scalingo/v8 v8.8.0 h1:OY14XbEEdZabwImRgXGL0txjesdhW8fX5/GrlAsxlBg= +github.com/Scalingo/go-scalingo/v8 v8.8.0/go.mod h1:C87ufsz8H4/tUutK6cAmUaLpM4HwV8QOGAyfZyRgFAA= github.com/Scalingo/go-utils/errors/v2 v2.5.1 h1:1tfJW6/ZxTgrRmFTlKQCOtArQquOW0/XdZQzx8wMHoM= github.com/Scalingo/go-utils/errors/v2 v2.5.1/go.mod h1:SbR1JuMtfAl+gpM7ahUW/c3Jm5MMzMAwJBk1pEHkVd8= github.com/Scalingo/go-utils/logger v1.11.0 h1:QUsGgZIv6LWUCyKKy06DuW67FLmzSmWPmnhD/3YlxeM= diff --git a/projects/details.go b/projects/details.go new file mode 100644 index 000000000..77c44d4cd --- /dev/null +++ b/projects/details.go @@ -0,0 +1,64 @@ +package projects + +import ( + "context" + "os" + "strconv" + + "github.com/olekukonko/tablewriter" + + "github.com/Scalingo/cli/config" + "github.com/Scalingo/go-utils/errors/v2" + "github.com/Scalingo/go-utils/logger" +) + +func Get(ctx context.Context, projectID string) error { + log := logger.Get(ctx) + client, err := config.ScalingoClient(ctx) + if err != nil { + return errors.Wrap(ctx, err, "get Scalingo client") + } + + project, err := client.ProjectGet(ctx, projectID) + if err != nil { + return errors.Wrap(ctx, err, "get project") + } + + t := tablewriter.NewWriter(os.Stdout) + t.Header([]string{"Project Field", "Value"}) + + _ = t.Append([]string{"Name", project.Name}) + _ = t.Append([]string{"ID", project.ID}) + _ = t.Append([]string{"Default", strconv.FormatBool(project.Default)}) + _ = t.Append([]string{"Owner", project.Owner.Username}) + + if project.Flags["private-network"] { + _ = t.Append([]string{"", ""}) + _ = t.Append([]string{"Private Network", "true"}) + + privateNetworkInfo, err := client.ProjectPrivateNetworkGet(ctx, projectID) + if err != nil { + log.WithError(err).Error("Failed to fetch private network info") + _ = t.Append([]string{"", "Failed to fetch private network info"}) + } else { + _ = t.Append([]string{" - ID", privateNetworkInfo.ID}) + _ = t.Append([]string{" - Subnet", privateNetworkInfo.Subnet}) + _ = t.Append([]string{" - Gateway IP", privateNetworkInfo.Gateway}) + _ = t.Append([]string{" - Total number of assignable IPs", strconv.Itoa(privateNetworkInfo.MaxIPsCount)}) + _ = t.Append([]string{" - Used IPs count", strconv.Itoa(privateNetworkInfo.UsedIPsCount)}) + + if len(privateNetworkInfo.UsedIPs) == 0 { + _ = t.Append([]string{" - Used IPs", "None"}) + } else { + _ = t.Append([]string{" - Used IPs", privateNetworkInfo.UsedIPs[0]}) + } + for _, usedIP := range privateNetworkInfo.UsedIPs[1:] { + _ = t.Append([]string{"", usedIP}) + } + } + } + + _ = t.Render() + + return nil +} diff --git a/projects/list.go b/projects/list.go index d1609b65a..d58b653cc 100644 --- a/projects/list.go +++ b/projects/list.go @@ -2,6 +2,7 @@ package projects import ( "context" + "fmt" "os" "strconv" @@ -26,10 +27,15 @@ func List(ctx context.Context) error { io.Warning("This command only displays projects where you are the owner") t := tablewriter.NewWriter(os.Stdout) - t.Header([]string{"Name", "Default", "ID"}) + t.Header([]string{"Name", "Default", "ID", "Private Network"}) for _, project := range projects { - _ = t.Append([]string{project.Name, strconv.FormatBool(project.Default), project.ID}) + hasPrivateNetwork := "" + if project.Flags["private-network"] { + hasPrivateNetwork = "true" + } + fmt.Print(project.Flags) + _ = t.Append([]string{project.Name, strconv.FormatBool(project.Default), project.ID, hasPrivateNetwork}) } _ = t.Render() diff --git a/vendor/github.com/Scalingo/go-scalingo/v8/CHANGELOG.md b/vendor/github.com/Scalingo/go-scalingo/v8/CHANGELOG.md index 1c115da94..889836e7e 100644 --- a/vendor/github.com/Scalingo/go-scalingo/v8/CHANGELOG.md +++ b/vendor/github.com/Scalingo/go-scalingo/v8/CHANGELOG.md @@ -2,6 +2,10 @@ ## To Be Released +## 8.8.0 + +* feat(projects): get project private network information + ## 8.7.1 * feat(events) add database backup events diff --git a/vendor/github.com/Scalingo/go-scalingo/v8/README.md b/vendor/github.com/Scalingo/go-scalingo/v8/README.md index f6afabf12..0d8ecfea1 100644 --- a/vendor/github.com/Scalingo/go-scalingo/v8/README.md +++ b/vendor/github.com/Scalingo/go-scalingo/v8/README.md @@ -1,4 +1,4 @@ -# Go client for Scalingo API v8.7.1 +# Go client for Scalingo API v8.8.0 This repository is the Go client for the [Scalingo APIs](https://developers.scalingo.com/). @@ -80,7 +80,7 @@ Bump new version number in: Commit, tag and create a new release: ```sh -version="8.7.1" +version="8.8.0" git switch --create release/${version} git add CHANGELOG.md README.md version.go diff --git a/vendor/github.com/Scalingo/go-scalingo/v8/projects.go b/vendor/github.com/Scalingo/go-scalingo/v8/projects.go index b79efb209..b37c29cb6 100644 --- a/vendor/github.com/Scalingo/go-scalingo/v8/projects.go +++ b/vendor/github.com/Scalingo/go-scalingo/v8/projects.go @@ -15,17 +15,28 @@ type ProjectsService interface { ProjectUpdate(ctx context.Context, projectID string, params ProjectUpdateParams) (Project, error) ProjectGet(ctx context.Context, projectID string) (Project, error) ProjectDelete(ctx context.Context, projectID string) error + ProjectPrivateNetworkGet(ctx context.Context, projectID string) (ProjectPrivateNetwork, error) } var _ ProjectsService = (*Client)(nil) type Project struct { - ID string `json:"id"` - Name string `json:"name"` - Default bool `json:"default"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` - Owner Owner `json:"owner"` + ID string `json:"id"` + Name string `json:"name"` + Default bool `json:"default"` + Flags map[string]bool `json:"flags"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + Owner Owner `json:"owner"` +} + +type ProjectPrivateNetwork struct { + ID string `json:"id"` + Subnet string `json:"subnet"` + Gateway string `json:"gateway"` + MaxIPsCount int `json:"max_ips_count"` + UsedIPsCount int `json:"used_ips_count"` + UsedIPs []string `json:"used_ips"` } type ProjectsRes struct { @@ -104,3 +115,13 @@ func (c *Client) ProjectDelete(ctx context.Context, projectID string) error { return nil } + +func (c *Client) ProjectPrivateNetworkGet(ctx context.Context, projectID string) (ProjectPrivateNetwork, error) { + var privateNetwork ProjectPrivateNetwork + err := c.ScalingoAPI().SubresourceList(ctx, projectResource, projectID, "private_network", nil, &privateNetwork) + if err != nil { + return ProjectPrivateNetwork{}, errors.Wrap(ctx, err, "get project private network") + } + + return privateNetwork, nil +} diff --git a/vendor/github.com/Scalingo/go-scalingo/v8/version.go b/vendor/github.com/Scalingo/go-scalingo/v8/version.go index 0cca9911f..9318e77a6 100644 --- a/vendor/github.com/Scalingo/go-scalingo/v8/version.go +++ b/vendor/github.com/Scalingo/go-scalingo/v8/version.go @@ -1,3 +1,3 @@ package scalingo -var Version = "8.7.1" +var Version = "8.8.0" diff --git a/vendor/modules.txt b/vendor/modules.txt index 4ff27f848..05088ca0c 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -37,7 +37,7 @@ github.com/ProtonMail/go-crypto/openpgp/packet github.com/ProtonMail/go-crypto/openpgp/s2k github.com/ProtonMail/go-crypto/openpgp/x25519 github.com/ProtonMail/go-crypto/openpgp/x448 -# github.com/Scalingo/go-scalingo/v8 v8.7.1 +# github.com/Scalingo/go-scalingo/v8 v8.8.0 ## explicit; go 1.24.0 github.com/Scalingo/go-scalingo/v8 github.com/Scalingo/go-scalingo/v8/billing