Skip to content

Commit 44551ac

Browse files
authored
Add create zone for tenant api (#194)
1 parent 697bc4c commit 44551ac

File tree

10 files changed

+791
-11
lines changed

10 files changed

+791
-11
lines changed

models/zone.go

Lines changed: 37 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

restapi/admin_tenants.go

Lines changed: 54 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,15 @@ func registerTenantHandlers(api *operations.McsAPI) {
102102
}
103103
return admin_api.NewUpdateTenantCreated()
104104
})
105+
106+
api.AdminAPITenantAddZoneHandler = admin_api.TenantAddZoneHandlerFunc(func(params admin_api.TenantAddZoneParams, session *models.Principal) middleware.Responder {
107+
err := getTenantAddZoneResponse(session, params)
108+
if err != nil {
109+
log.Println(err)
110+
return admin_api.NewTenantAddZoneDefault(500).WithPayload(&models.Error{Code: 500, Message: swag.String("Unable to update tenant")})
111+
}
112+
return admin_api.NewTenantAddZoneCreated()
113+
})
105114
}
106115

107116
// deleteTenantAction performs the actions of deleting a tenant
@@ -180,8 +189,8 @@ func getTenantInfo(minioInstance *operator.MinIOInstance, tenantInfo *usageInfo)
180189

181190
for _, z := range minioInstance.Spec.Zones {
182191
zones = append(zones, &models.Zone{
183-
Name: z.Name,
184-
Servers: int64(z.Servers),
192+
Name: swag.String(z.Name),
193+
Servers: swag.Int64(int64(z.Servers)),
185194
})
186195
}
187196

@@ -465,8 +474,8 @@ func getTenantCreatedResponse(session *models.Principal, params admin_api.Create
465474
if len(params.Body.Zones) > 0 {
466475
for _, zone := range params.Body.Zones {
467476
minInst.Spec.Zones = append(minInst.Spec.Zones, operator.Zone{
468-
Name: zone.Name,
469-
Servers: int32(zone.Servers),
477+
Name: *zone.Name,
478+
Servers: int32(*zone.Servers),
470479
})
471480
}
472481
}
@@ -544,9 +553,6 @@ func updateTenantAction(ctx context.Context, operatorClient OperatorClient, http
544553

545554
func getUpdateTenantResponse(session *models.Principal, params admin_api.UpdateTenantParams) error {
546555
ctx := context.Background()
547-
// TODO: use namespace of the tenant not from the controller
548-
currentNamespace := cluster.GetNs()
549-
550556
opClientClientSet, err := cluster.OperatorClient(session.SessionToken)
551557
if err != nil {
552558
log.Println("error getting operator client:", err)
@@ -561,10 +567,50 @@ func getUpdateTenantResponse(session *models.Principal, params admin_api.UpdateT
561567
Timeout: 4 * time.Second,
562568
},
563569
}
564-
if err := updateTenantAction(ctx, opClient, httpC, currentNamespace, params); err != nil {
570+
if err := updateTenantAction(ctx, opClient, httpC, params.Namespace, params); err != nil {
565571
log.Println("error patching MinioInstance:", err)
566572
return err
567573
}
574+
return nil
575+
}
576+
577+
// addTenantZone creates a zone to a defined tenant
578+
func addTenantZone(ctx context.Context, operatorClient OperatorClient, params admin_api.TenantAddZoneParams) error {
579+
minInst, err := operatorClient.MinIOInstanceGet(ctx, params.Namespace, params.Tenant, metav1.GetOptions{})
580+
if err != nil {
581+
return err
582+
}
583+
584+
minInst.Spec.Zones = append(minInst.Spec.Zones, operator.Zone{
585+
Name: *params.Body.Name,
586+
Servers: int32(*params.Body.Servers),
587+
})
588+
589+
payloadBytes, err := json.Marshal(minInst)
590+
if err != nil {
591+
return err
592+
}
568593

594+
_, err = operatorClient.MinIOInstancePatch(ctx, params.Namespace, minInst.Name, types.MergePatchType, payloadBytes, metav1.PatchOptions{})
595+
if err != nil {
596+
return err
597+
}
598+
return nil
599+
}
600+
601+
func getTenantAddZoneResponse(session *models.Principal, params admin_api.TenantAddZoneParams) error {
602+
ctx := context.Background()
603+
opClientClientSet, err := cluster.OperatorClient(session.SessionToken)
604+
if err != nil {
605+
log.Println("error getting operator client:", err)
606+
return err
607+
}
608+
opClient := &operatorClient{
609+
client: opClientClientSet,
610+
}
611+
if err := addTenantZone(ctx, opClient, params); err != nil {
612+
log.Println("error patching MinioInstance:", err)
613+
return err
614+
}
569615
return nil
570616
}

restapi/admin_tenants_test.go

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"reflect"
2626
"testing"
2727

28+
"github.com/go-openapi/swag"
2829
"github.com/minio/mcs/cluster"
2930
"github.com/minio/mcs/models"
3031
"github.com/minio/mcs/restapi/operations/admin_api"
@@ -299,6 +300,97 @@ func Test_deleteTenantAction(t *testing.T) {
299300
}
300301
}
301302

303+
func Test_TenantAddZone(t *testing.T) {
304+
opClient := opClientMock{}
305+
306+
type args struct {
307+
ctx context.Context
308+
operatorClient OperatorClient
309+
nameSpace string
310+
mockMinioInstancePatch func(ctx context.Context, namespace string, instanceName string, pt types.PatchType, data []byte, options metav1.PatchOptions) (*v1.MinIOInstance, error)
311+
mockMinioInstanceGet func(ctx context.Context, namespace string, instanceName string, options metav1.GetOptions) (*v1.MinIOInstance, error)
312+
params admin_api.TenantAddZoneParams
313+
}
314+
tests := []struct {
315+
name string
316+
args args
317+
wantErr bool
318+
}{
319+
{
320+
name: "Add zone, no errors",
321+
args: args{
322+
ctx: context.Background(),
323+
operatorClient: opClient,
324+
nameSpace: "default",
325+
mockMinioInstancePatch: func(ctx context.Context, namespace string, instanceName string, pt types.PatchType, data []byte, options metav1.PatchOptions) (*v1.MinIOInstance, error) {
326+
return &v1.MinIOInstance{}, nil
327+
},
328+
mockMinioInstanceGet: func(ctx context.Context, namespace string, instanceName string, options metav1.GetOptions) (*v1.MinIOInstance, error) {
329+
return &v1.MinIOInstance{}, nil
330+
},
331+
params: admin_api.TenantAddZoneParams{
332+
Body: &models.Zone{
333+
Name: swag.String("zone-1"),
334+
Servers: swag.Int64(int64(4)),
335+
},
336+
},
337+
},
338+
wantErr: false,
339+
},
340+
{
341+
name: "Error on patch, handle error",
342+
args: args{
343+
ctx: context.Background(),
344+
operatorClient: opClient,
345+
nameSpace: "default",
346+
mockMinioInstancePatch: func(ctx context.Context, namespace string, instanceName string, pt types.PatchType, data []byte, options metav1.PatchOptions) (*v1.MinIOInstance, error) {
347+
return nil, errors.New("errors")
348+
},
349+
mockMinioInstanceGet: func(ctx context.Context, namespace string, instanceName string, options metav1.GetOptions) (*v1.MinIOInstance, error) {
350+
return &v1.MinIOInstance{}, nil
351+
},
352+
params: admin_api.TenantAddZoneParams{
353+
Body: &models.Zone{
354+
Name: swag.String("zone-1"),
355+
Servers: swag.Int64(int64(4)),
356+
},
357+
},
358+
},
359+
wantErr: true,
360+
},
361+
{
362+
name: "Error on get, handle error",
363+
args: args{
364+
ctx: context.Background(),
365+
operatorClient: opClient,
366+
nameSpace: "default",
367+
mockMinioInstancePatch: func(ctx context.Context, namespace string, instanceName string, pt types.PatchType, data []byte, options metav1.PatchOptions) (*v1.MinIOInstance, error) {
368+
return nil, errors.New("errors")
369+
},
370+
mockMinioInstanceGet: func(ctx context.Context, namespace string, instanceName string, options metav1.GetOptions) (*v1.MinIOInstance, error) {
371+
return nil, errors.New("errors")
372+
},
373+
params: admin_api.TenantAddZoneParams{
374+
Body: &models.Zone{
375+
Name: swag.String("zone-1"),
376+
Servers: swag.Int64(int64(4)),
377+
},
378+
},
379+
},
380+
wantErr: true,
381+
},
382+
}
383+
for _, tt := range tests {
384+
opClientMinioInstanceGetMock = tt.args.mockMinioInstanceGet
385+
opClientMinioInstancePatchMock = tt.args.mockMinioInstancePatch
386+
t.Run(tt.name, func(t *testing.T) {
387+
if err := addTenantZone(tt.args.ctx, tt.args.operatorClient, tt.args.params); (err != nil) != tt.wantErr {
388+
t.Errorf("addTenantZone() error = %v, wantErr %v", err, tt.wantErr)
389+
}
390+
})
391+
}
392+
}
393+
302394
func Test_UpdateTenantAction(t *testing.T) {
303395
opClient := opClientMock{}
304396
httpClientM := httpClientMock{}

restapi/embedded_spec.go

Lines changed: 92 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)