Skip to content

Commit 9162147

Browse files
authored
Merge pull request #170 from xoanmi/featiure/GH-169_Implement_Configure_Client
Implement Configure Public Client
2 parents c5b9d9c + 7ef91d4 commit 9162147

File tree

6 files changed

+244
-0
lines changed

6 files changed

+244
-0
lines changed

apiv2/client.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"net/url"
66
"strings"
77

8+
"github.com/mittwald/goharbor-client/v5/apiv2/pkg/clients/configure"
89
"github.com/mittwald/goharbor-client/v5/apiv2/pkg/clients/ping"
910
"github.com/mittwald/goharbor-client/v5/apiv2/pkg/clients/statistic"
1011

@@ -49,6 +50,7 @@ const v2URLSuffix string = "/v2.0"
4950
type Client interface {
5051
auditlog.Client
5152
artifact.Client
53+
configure.Client
5254
gc.Client
5355
health.Client
5456
label.Client
@@ -73,6 +75,7 @@ type Client interface {
7375
type RESTClient struct {
7476
auditlog *auditlog.RESTClient
7577
artifact *artifact.RESTClient
78+
configure *configure.RESTClient
7679
gc *gc.RESTClient
7780
health *health.RESTClient
7881
label *label.RESTClient
@@ -103,6 +106,7 @@ func NewRESTClient(v2Client *v2client.Harbor, opts *config.Options, authInfo run
103106
return &RESTClient{
104107
auditlog: auditlog.NewClient(v2Client, opts, authInfo),
105108
artifact: artifact.NewClient(v2Client, opts, authInfo),
109+
configure: configure.NewClient(v2Client, opts, authInfo),
106110
gc: gc.NewClient(v2Client, opts, authInfo),
107111
health: health.NewClient(v2Client, opts, authInfo),
108112
label: label.NewClient(v2Client, opts, authInfo),
@@ -213,6 +217,16 @@ func (c *RESTClient) RemoveLabel(ctx context.Context, projectName, repositoryNam
213217
return c.artifact.RemoveLabel(ctx, projectName, repositoryName, reference, id)
214218
}
215219

220+
// Configure Client
221+
222+
func (c *RESTClient) GetConfig(ctx context.Context) (*modelv2.ConfigurationsResponse, error) {
223+
return c.configure.GetConfigs(ctx)
224+
}
225+
226+
func (c *RESTClient) UpdateConfigs(ctx context.Context, cfg *modelv2.Configurations) error {
227+
return c.configure.UpdateConfigs(ctx, cfg)
228+
}
229+
216230
// GC Client
217231

218232
func (c *RESTClient) NewGarbageCollection(ctx context.Context, gcSchedule *modelv2.Schedule) error {
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package configure
2+
3+
import (
4+
"context"
5+
6+
"github.com/go-openapi/runtime"
7+
8+
v2client "github.com/mittwald/goharbor-client/v5/apiv2/internal/api/client"
9+
"github.com/mittwald/goharbor-client/v5/apiv2/internal/api/client/configure"
10+
"github.com/mittwald/goharbor-client/v5/apiv2/model"
11+
"github.com/mittwald/goharbor-client/v5/apiv2/pkg/config"
12+
)
13+
14+
// RESTClient is a subclient for handling project related actions.
15+
type RESTClient struct {
16+
// Options contains optional configuration when making API calls.
17+
Options *config.Options
18+
19+
// The new client of the harbor v2 API
20+
V2Client *v2client.Harbor
21+
22+
// AuthInfo contains the auth information that is provided on API calls.
23+
AuthInfo runtime.ClientAuthInfoWriter
24+
}
25+
26+
func NewClient(v2Client *v2client.Harbor, opts *config.Options, authInfo runtime.ClientAuthInfoWriter) *RESTClient {
27+
return &RESTClient{
28+
Options: opts,
29+
V2Client: v2Client,
30+
AuthInfo: authInfo,
31+
}
32+
}
33+
34+
type Client interface {
35+
GetConfigs(ctx context.Context) (*model.ConfigurationsResponse, error)
36+
UpdateConfigs(ctx context.Context, newConfiguration *model.Configurations) error
37+
}
38+
39+
// GetConfigs returns a system configurations object.
40+
func (c *RESTClient) GetConfigs(ctx context.Context) (*model.ConfigurationsResponse, error) {
41+
params := &configure.GetConfigurationsParams{
42+
Context: ctx,
43+
}
44+
45+
params.WithTimeout(c.Options.Timeout)
46+
47+
resp, err := c.V2Client.Configure.GetConfigurations(params, c.AuthInfo)
48+
if err != nil {
49+
return nil, handleSwaggerConfigurationsErrors(err)
50+
}
51+
52+
return resp.Payload, nil
53+
}
54+
55+
// UpdateConfigs modifying system configurations that only provides for admin users.
56+
func (c *RESTClient) UpdateConfigs(ctx context.Context, cfg *model.Configurations) error {
57+
params := &configure.UpdateConfigurationsParams{
58+
Configurations: cfg,
59+
Context: ctx,
60+
}
61+
params.WithTimeout(c.Options.Timeout)
62+
_, err := c.V2Client.Configure.UpdateConfigurations(params, c.AuthInfo)
63+
return handleSwaggerConfigurationsErrors(err)
64+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package configure
2+
3+
import (
4+
"net/http"
5+
6+
"github.com/go-openapi/runtime"
7+
8+
"github.com/mittwald/goharbor-client/v5/apiv2/pkg/errors"
9+
)
10+
11+
// handleSwaggerConfigurationsErrors takes a swagger generated error as input,
12+
// which usually does not contain any form of error message,
13+
// and outputs a new error with a proper message.
14+
func handleSwaggerConfigurationsErrors(in error) error {
15+
t, ok := in.(*runtime.APIError)
16+
if ok {
17+
switch t.Code {
18+
case http.StatusUnauthorized:
19+
return &errors.ErrConfigureUnauthorized{}
20+
case http.StatusForbidden:
21+
return &errors.ErrConfigureNoPermission{}
22+
case http.StatusInternalServerError:
23+
return &errors.ErrConfigureInternalServerError{}
24+
}
25+
}
26+
return nil
27+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
//go:build integration
2+
3+
package configure
4+
5+
import (
6+
"context"
7+
"testing"
8+
9+
modelv2 "github.com/mittwald/goharbor-client/v5/apiv2/model"
10+
clienttesting "github.com/mittwald/goharbor-client/v5/apiv2/pkg/testing"
11+
12+
"github.com/stretchr/testify/require"
13+
)
14+
15+
func TestAPIGetConfig(t *testing.T) {
16+
ctx := context.Background()
17+
c := NewClient(clienttesting.V2SwaggerClient, clienttesting.DefaultOpts, clienttesting.AuthInfo)
18+
19+
resp, err := c.GetConfigs(ctx)
20+
require.NoError(t, err)
21+
22+
require.Equal(t, "db_auth", *&resp.AuthMode.Value)
23+
}
24+
25+
func TestAPIUpdateConfigs(t *testing.T) {
26+
authMode := "db_auth"
27+
ctx := context.Background()
28+
c := NewClient(clienttesting.V2SwaggerClient, clienttesting.DefaultOpts, clienttesting.AuthInfo)
29+
30+
err := c.UpdateConfigs(ctx, &modelv2.Configurations{AuthMode: &authMode})
31+
require.NoError(t, err)
32+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
//go:build !integration
2+
3+
package configure
4+
5+
import (
6+
"context"
7+
"testing"
8+
9+
"github.com/mittwald/goharbor-client/v5/apiv2/internal/api/client/configure"
10+
"github.com/mittwald/goharbor-client/v5/apiv2/mocks"
11+
"github.com/mittwald/goharbor-client/v5/apiv2/model"
12+
clienttesting "github.com/mittwald/goharbor-client/v5/apiv2/pkg/testing"
13+
"github.com/stretchr/testify/mock"
14+
"github.com/stretchr/testify/require"
15+
)
16+
17+
var (
18+
authMode = "oidc"
19+
OIDCName = "example"
20+
exampleConfig = &model.Configurations{
21+
AuthMode: &authMode,
22+
OIDCName: &OIDCName,
23+
}
24+
ctx = context.Background()
25+
)
26+
27+
func APIandMockClientsForTests() (*RESTClient, *clienttesting.MockClients) {
28+
desiredMockClients := &clienttesting.MockClients{
29+
Configure: mocks.MockConfigureClientService{},
30+
}
31+
32+
v2Client := clienttesting.BuildV2ClientWithMocks(desiredMockClients)
33+
34+
cl := NewClient(v2Client, clienttesting.DefaultOpts, clienttesting.AuthInfo)
35+
36+
return cl, desiredMockClients
37+
}
38+
39+
func TestRESTClient_GetConfigurations(t *testing.T) {
40+
apiClient, mockClient := APIandMockClientsForTests()
41+
42+
params := &configure.GetConfigurationsParams{
43+
Context: ctx,
44+
}
45+
params.WithTimeout(apiClient.Options.Timeout)
46+
47+
mockClient.Configure.On("GetConfigurations", params, mock.AnythingOfType("runtime.ClientAuthInfoWriterFunc")).Return(&configure.GetConfigurationsOK{}, nil)
48+
49+
_, err := apiClient.GetConfigs(ctx)
50+
51+
require.NoError(t, err)
52+
mockClient.Configure.AssertExpectations(t)
53+
}
54+
55+
func TestRESTClient_UpdateConfigs(t *testing.T) {
56+
apiClient, mockClient := APIandMockClientsForTests()
57+
58+
params := &configure.UpdateConfigurationsParams{
59+
Configurations: exampleConfig,
60+
Context: ctx,
61+
}
62+
params.WithTimeout(apiClient.Options.Timeout)
63+
64+
mockClient.Configure.On("UpdateConfigurations", params, mock.AnythingOfType("runtime.ClientAuthInfoWriterFunc")).Return(&configure.UpdateConfigurationsOK{}, nil)
65+
66+
err := apiClient.UpdateConfigs(ctx, exampleConfig)
67+
require.NoError(t, err)
68+
mockClient.Configure.AssertExpectations(t)
69+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package errors
2+
3+
const (
4+
// ErrConfigureUnauthorizedMsg is the error message for ErrConfigureUnauthorized error.
5+
ErrConfigureUnauthorizedMsg = "unauthorized"
6+
7+
// ErrConfigureNoPermissionMsg is the error message for ErrConfigureNoPermission error.
8+
ErrConfigureNoPermissionMsg = "user does not have permission of admin role"
9+
10+
// ErrConfigureInternalServerErrorMsg is the error message for ErrConfigureInternalServerError error.
11+
ErrConfigureInternalServerErrorMsg = "unexpected internal errors"
12+
)
13+
14+
type (
15+
// ErrConfigureInternalServerError describes server-side internal errors.
16+
ErrConfigureInternalServerError struct{}
17+
18+
// ErrConfigureNoPermission describes a request error without permission.
19+
ErrConfigureNoPermission struct{}
20+
21+
// ErrConfigureUnauthorized describes an unauthorized request.
22+
ErrConfigureUnauthorized struct{}
23+
)
24+
25+
// Error returns the error message.
26+
func (e *ErrConfigureUnauthorized) Error() string {
27+
return ErrConfigureUnauthorizedMsg
28+
}
29+
30+
// Error returns the error message.
31+
func (e *ErrConfigureNoPermission) Error() string {
32+
return ErrConfigureNoPermissionMsg
33+
}
34+
35+
// Error returns the error message.
36+
func (e *ErrConfigureInternalServerError) Error() string {
37+
return ErrConfigureInternalServerErrorMsg
38+
}

0 commit comments

Comments
 (0)