Skip to content

Commit 54c7e99

Browse files
Merge pull request #29 from MagaluCloud/feat/object-storage-buckets
feat: add object storage - buckets commands
2 parents a8e7419 + cb90ba6 commit 54c7e99

File tree

39 files changed

+2513
-55
lines changed

39 files changed

+2513
-55
lines changed

base-cli/cmd/common/auth/http.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ func (rt *authRoundTripper) RoundTrip(req *http.Request) (*http.Response, error)
2727
return nil, fmt.Errorf("não foi possível obter o token de acesso. Você esqueceu de fazer login?")
2828
}
2929

30-
req.Header.Set("Authorization", "Bearer "+token)
30+
if req.Header.Get("Authorization") == "" {
31+
req.Header.Set("Authorization", "Bearer "+token)
32+
}
3133

3234
waitBeforeRetry := 100 * time.Millisecond
3335
var res *http.Response

base-cli/cmd/static/auth/clients/common.go

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,5 @@
11
package clients
22

3-
import (
4-
"github.com/spf13/cobra"
5-
)
6-
7-
func NilIfNotChanged[T any](
8-
cmd *cobra.Command,
9-
flag string,
10-
target **T,
11-
value T,
12-
) {
13-
if !cmd.Flags().Changed(flag) {
14-
*target = nil
15-
} else {
16-
*target = &value
17-
}
18-
}
19-
203
const (
214
ID = "id"
225
Name = "name"

base-cli/cmd/static/auth/clients/create.go

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/magaluCloud/mgccli/beautiful"
1212
"github.com/magaluCloud/mgccli/cmd/common/auth"
1313
cmdutils "github.com/magaluCloud/mgccli/cmd_utils"
14+
cobrautils "github.com/magaluCloud/mgccli/cobra_utils/flags"
1415
"github.com/magaluCloud/mgccli/i18n"
1516
"github.com/spf13/cobra"
1617
)
@@ -115,17 +116,17 @@ func CreateCommand(ctx context.Context) *cobra.Command {
115116
RefreshTokenExp: opts.RefreshTokenExp,
116117
}
117118

118-
NilIfNotChanged(cmd, BackchannelLogoutSessionEnabled, &params.BackchannelLogoutSessionEnabled, opts.BackchannelLogoutSessionEnabled)
119-
NilIfNotChanged(cmd, Audiences, &params.Audiences, opts.Audiences)
120-
NilIfNotChanged(cmd, Reason, &params.Reason, opts.Reason)
121-
NilIfNotChanged(cmd, Icon, &params.Icon, opts.Icon)
122-
NilIfNotChanged(cmd, AlwaysRequireLogin, &params.AlwaysRequireLogin, opts.AlwaysRequireLogin)
123-
NilIfNotChanged(cmd, BackchannelLogoutURI, &params.BackchannelLogoutURI, opts.BackchannelLogoutURI)
124-
NilIfNotChanged(cmd, OidcAudience, &params.OidcAudience, opts.OidcAudience)
125-
NilIfNotChanged(cmd, RefreshTokenCustomExpiresEnabled, &params.RefreshTokenCustomExpiresEnabled, opts.RefreshTokenCustomExpiresEnabled)
126-
NilIfNotChanged(cmd, SupportURL, &params.SupportURL, opts.SupportURL)
127-
NilIfNotChanged(cmd, Email, &params.Email, opts.Email)
128-
NilIfNotChanged(cmd, GrantTypes, &params.GrantTypes, opts.GrantTypes)
119+
cobrautils.NilIfNotChanged(cmd, BackchannelLogoutSessionEnabled, &params.BackchannelLogoutSessionEnabled, opts.BackchannelLogoutSessionEnabled)
120+
cobrautils.NilIfNotChanged(cmd, Audiences, &params.Audiences, opts.Audiences)
121+
cobrautils.NilIfNotChanged(cmd, Reason, &params.Reason, opts.Reason)
122+
cobrautils.NilIfNotChanged(cmd, Icon, &params.Icon, opts.Icon)
123+
cobrautils.NilIfNotChanged(cmd, AlwaysRequireLogin, &params.AlwaysRequireLogin, opts.AlwaysRequireLogin)
124+
cobrautils.NilIfNotChanged(cmd, BackchannelLogoutURI, &params.BackchannelLogoutURI, opts.BackchannelLogoutURI)
125+
cobrautils.NilIfNotChanged(cmd, OidcAudience, &params.OidcAudience, opts.OidcAudience)
126+
cobrautils.NilIfNotChanged(cmd, RefreshTokenCustomExpiresEnabled, &params.RefreshTokenCustomExpiresEnabled, opts.RefreshTokenCustomExpiresEnabled)
127+
cobrautils.NilIfNotChanged(cmd, SupportURL, &params.SupportURL, opts.SupportURL)
128+
cobrautils.NilIfNotChanged(cmd, Email, &params.Email, opts.Email)
129+
cobrautils.NilIfNotChanged(cmd, GrantTypes, &params.GrantTypes, opts.GrantTypes)
129130

130131
return runCreate(ctx, params, raw)
131132
},

base-cli/cmd/static/auth/clients/update.go

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/magaluCloud/mgccli/beautiful"
1212
"github.com/magaluCloud/mgccli/cmd/common/auth"
1313
cmdutils "github.com/magaluCloud/mgccli/cmd_utils"
14+
cobrautils "github.com/magaluCloud/mgccli/cobra_utils/flags"
1415
"github.com/magaluCloud/mgccli/i18n"
1516
"github.com/spf13/cobra"
1617
)
@@ -87,7 +88,7 @@ func UpdateCommand(ctx context.Context) *cobra.Command {
8788
manager := i18n.GetInstance()
8889

8990
cmd := &cobra.Command{
90-
Use: "update",
91+
Use: "update [id]",
9192
Short: manager.T("cli.auth.clients.update.short"),
9293
Long: manager.T("cli.auth.clients.update.long"),
9394
Example: `mgc auth clients update --access-token-expiration=7200 --audiences="public" --description="Client description" --name="Client Name" --refresh-token-exp=15552000`,
@@ -98,24 +99,24 @@ func UpdateCommand(ctx context.Context) *cobra.Command {
9899
ID: opts.ID,
99100
}
100101

101-
NilIfNotChanged(cmd, Name, &params.Name, opts.Name)
102-
NilIfNotChanged(cmd, Description, &params.Description, opts.Description)
103-
NilIfNotChanged(cmd, RedirectURIs, &params.RedirectURIs, opts.RedirectURIs)
104-
NilIfNotChanged(cmd, BackchannelLogoutSessionEnabled, &params.BackchannelLogoutSessionEnabled, opts.BackchannelLogoutSessionEnabled)
105-
NilIfNotChanged(cmd, ClientTermsURL, &params.ClientTermsURL, opts.ClientTermsURL)
106-
NilIfNotChanged(cmd, ClientPrivacyTermURL, &params.ClientPrivacyTermURL, opts.ClientPrivacyTermURL)
107-
NilIfNotChanged(cmd, Audiences, &params.Audiences, opts.Audiences)
108-
NilIfNotChanged(cmd, Reason, &params.Reason, opts.Reason)
109-
NilIfNotChanged(cmd, Icon, &params.Icon, opts.Icon)
110-
NilIfNotChanged(cmd, AccessTokenExp, &params.AccessTokenExp, opts.AccessTokenExp)
111-
NilIfNotChanged(cmd, AlwaysRequireLogin, &params.AlwaysRequireLogin, opts.AlwaysRequireLogin)
112-
NilIfNotChanged(cmd, BackchannelLogoutURI, &params.BackchannelLogoutURI, opts.BackchannelLogoutURI)
113-
NilIfNotChanged(cmd, OidcAudience, &params.OidcAudience, opts.OidcAudience)
114-
NilIfNotChanged(cmd, RefreshTokenCustomExpiresEnabled, &params.RefreshTokenCustomExpiresEnabled, opts.RefreshTokenCustomExpiresEnabled)
115-
NilIfNotChanged(cmd, RefreshTokenExp, &params.RefreshTokenExp, opts.RefreshTokenExp)
116-
NilIfNotChanged(cmd, SupportURL, &params.SupportURL, opts.SupportURL)
117-
118-
return runUpdate(ctx, params, raw)
102+
cobrautils.NilIfNotChanged(cmd, Name, &params.Name, opts.Name)
103+
cobrautils.NilIfNotChanged(cmd, Description, &params.Description, opts.Description)
104+
cobrautils.NilIfNotChanged(cmd, RedirectURIs, &params.RedirectURIs, opts.RedirectURIs)
105+
cobrautils.NilIfNotChanged(cmd, BackchannelLogoutSessionEnabled, &params.BackchannelLogoutSessionEnabled, opts.BackchannelLogoutSessionEnabled)
106+
cobrautils.NilIfNotChanged(cmd, ClientTermsURL, &params.ClientTermsURL, opts.ClientTermsURL)
107+
cobrautils.NilIfNotChanged(cmd, ClientPrivacyTermURL, &params.ClientPrivacyTermURL, opts.ClientPrivacyTermURL)
108+
cobrautils.NilIfNotChanged(cmd, Audiences, &params.Audiences, opts.Audiences)
109+
cobrautils.NilIfNotChanged(cmd, Reason, &params.Reason, opts.Reason)
110+
cobrautils.NilIfNotChanged(cmd, Icon, &params.Icon, opts.Icon)
111+
cobrautils.NilIfNotChanged(cmd, AccessTokenExp, &params.AccessTokenExp, opts.AccessTokenExp)
112+
cobrautils.NilIfNotChanged(cmd, AlwaysRequireLogin, &params.AlwaysRequireLogin, opts.AlwaysRequireLogin)
113+
cobrautils.NilIfNotChanged(cmd, BackchannelLogoutURI, &params.BackchannelLogoutURI, opts.BackchannelLogoutURI)
114+
cobrautils.NilIfNotChanged(cmd, OidcAudience, &params.OidcAudience, opts.OidcAudience)
115+
cobrautils.NilIfNotChanged(cmd, RefreshTokenCustomExpiresEnabled, &params.RefreshTokenCustomExpiresEnabled, opts.RefreshTokenCustomExpiresEnabled)
116+
cobrautils.NilIfNotChanged(cmd, RefreshTokenExp, &params.RefreshTokenExp, opts.RefreshTokenExp)
117+
cobrautils.NilIfNotChanged(cmd, SupportURL, &params.SupportURL, opts.SupportURL)
118+
119+
return runUpdate(ctx, params, args, raw)
119120
},
120121
}
121122

@@ -137,13 +138,25 @@ func UpdateCommand(ctx context.Context) *cobra.Command {
137138
cmd.Flags().IntVar(&opts.RefreshTokenExp, RefreshTokenExp, 15552000, manager.T("cli.auth.clients.create.refresh_token_exp"))
138139
cmd.Flags().StringVar(&opts.SupportURL, SupportURL, "", manager.T("cli.auth.clients.create.support_url"))
139140

140-
cmd.MarkFlagRequired(ID)
141-
142141
return cmd
143142
}
144143

145144
// runUpdate executa o processo de atualizar as informações de um cliente
146-
func runUpdate(ctx context.Context, opts UpdateClientParams, rawMode bool) error {
145+
func runUpdate(ctx context.Context, opts UpdateClientParams, args []string, rawMode bool) error {
146+
id := opts.ID
147+
148+
if len(args) > 0 {
149+
id = args[0]
150+
}
151+
152+
if id == "" {
153+
beautiful.NewOutput(rawMode).PrintError("é necessário fornecer o ID como argumento ou usar a flag --id")
154+
155+
return nil
156+
}
157+
158+
opts.ID = id
159+
147160
var confirm bool
148161
huh.NewConfirm().Title(fmt.Sprintf("This operation may disable your client %s until updates are approved by the ID Magalu. Do you wish to continue?", opts.ID)).
149162
Affirmative("Yes").
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package acl
2+
3+
import (
4+
"context"
5+
6+
"github.com/magaluCloud/mgccli/i18n"
7+
"github.com/spf13/cobra"
8+
)
9+
10+
// ACLCommand cria e configura o comando de ACL
11+
func ACLCommand(ctx context.Context) *cobra.Command {
12+
manager := i18n.GetInstance()
13+
14+
cmd := &cobra.Command{
15+
Use: "acl",
16+
Short: manager.T("cli.auth.object_storage.buckets.acl.short"),
17+
}
18+
19+
cmd.AddCommand(GetCommand(ctx))
20+
cmd.AddCommand(SetCommand(ctx))
21+
22+
return cmd
23+
}
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package acl
2+
3+
import (
4+
"context"
5+
"encoding/xml"
6+
"fmt"
7+
"net/http"
8+
"net/url"
9+
10+
"github.com/magaluCloud/mgccli/beautiful"
11+
configPkg "github.com/magaluCloud/mgccli/cmd/common/config"
12+
"github.com/magaluCloud/mgccli/cmd/static/object_storage/buckets/common"
13+
cmdutils "github.com/magaluCloud/mgccli/cmd_utils"
14+
"github.com/magaluCloud/mgccli/i18n"
15+
"github.com/spf13/cobra"
16+
)
17+
18+
type getOptions struct {
19+
Dst string
20+
}
21+
22+
type AccessControlPolicy struct {
23+
Owner Owner `xml:"Owner"`
24+
AccessControlList AccessControlList `xml:"AccessControlList"`
25+
}
26+
27+
type Owner struct {
28+
ID string `xml:"ID"`
29+
DisplayName string `xml:"DisplayName"`
30+
}
31+
32+
type AccessControlList struct {
33+
Grants []Grant `xml:"Grant"`
34+
}
35+
36+
type Grant struct {
37+
Grantee Grantee `xml:"Grantee"`
38+
Permission string `xml:"Permission"`
39+
}
40+
41+
type Grantee struct {
42+
ID string `xml:"ID"`
43+
DisplayName string `xml:"DisplayName"`
44+
URI string `xml:"URI"`
45+
}
46+
47+
// GetCommand cria o comando de retornar o ACL do bucket
48+
func GetCommand(ctx context.Context) *cobra.Command {
49+
manager := i18n.GetInstance()
50+
var opts getOptions
51+
52+
cmd := &cobra.Command{
53+
Use: "get [dst]",
54+
Short: manager.T("cli.auth.object_storage.buckets.acl.get.short"),
55+
RunE: func(cmd *cobra.Command, args []string) error {
56+
raw, _ := cmd.Root().PersistentFlags().GetBool("raw")
57+
58+
return runGet(ctx, args, opts, raw)
59+
},
60+
}
61+
62+
cmd.Flags().StringVar(&opts.Dst, "dst", "", manager.T("cli.auth.object_storage.buckets.dst"))
63+
64+
return cmd
65+
}
66+
67+
// runGet executa o processo de o ACL do bucket
68+
func runGet(ctx context.Context, args []string, opts getOptions, rawMode bool) error {
69+
bucketName := opts.Dst
70+
71+
if len(args) > 0 {
72+
bucketName = args[0]
73+
}
74+
75+
if bucketName == "" {
76+
beautiful.NewOutput(rawMode).PrintError("é necessário fornecer o nome do bucket como argumento ou usar a flag --dst")
77+
78+
return nil
79+
}
80+
81+
config := ctx.Value(cmdutils.CXT_CONFIG_KEY).(configPkg.Config)
82+
83+
region, err := config.Get("region")
84+
if err != nil {
85+
return fmt.Errorf("erro ao pegar a região: %w", err)
86+
}
87+
88+
host, err := common.BuildHost(bucketName, region.Value.(string))
89+
if err != nil {
90+
return err
91+
}
92+
93+
bucketURL, err := url.Parse(host)
94+
if err != nil {
95+
return err
96+
}
97+
98+
query := bucketURL.Query()
99+
query.Add("acl", "")
100+
bucketURL.RawQuery = query.Encode()
101+
102+
req, err := http.NewRequestWithContext(ctx, http.MethodGet, bucketURL.String(), nil)
103+
if err != nil {
104+
return err
105+
}
106+
107+
resp, err := common.SendRequest(ctx, req, region.Value.(string))
108+
if err != nil {
109+
return err
110+
}
111+
112+
if resp.StatusCode != http.StatusOK {
113+
return cmdutils.NewHttpErrorFromResponse(resp, req)
114+
}
115+
116+
defer resp.Body.Close()
117+
var result AccessControlPolicy
118+
if err = xml.NewDecoder(resp.Body).Decode(&result); err != nil {
119+
return err
120+
}
121+
122+
beautiful.NewOutput(rawMode).PrintData(result)
123+
124+
return nil
125+
}

0 commit comments

Comments
 (0)