Skip to content

Commit

Permalink
Add create zone for tenant api (#194)
Browse files Browse the repository at this point in the history
  • Loading branch information
cesnietor authored Jul 14, 2020
1 parent 697bc4c commit 44551ac
Show file tree
Hide file tree
Showing 10 changed files with 791 additions and 11 deletions.
39 changes: 37 additions & 2 deletions models/zone.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

62 changes: 54 additions & 8 deletions restapi/admin_tenants.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,15 @@ func registerTenantHandlers(api *operations.McsAPI) {
}
return admin_api.NewUpdateTenantCreated()
})

api.AdminAPITenantAddZoneHandler = admin_api.TenantAddZoneHandlerFunc(func(params admin_api.TenantAddZoneParams, session *models.Principal) middleware.Responder {
err := getTenantAddZoneResponse(session, params)
if err != nil {
log.Println(err)
return admin_api.NewTenantAddZoneDefault(500).WithPayload(&models.Error{Code: 500, Message: swag.String("Unable to update tenant")})
}
return admin_api.NewTenantAddZoneCreated()
})
}

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

for _, z := range minioInstance.Spec.Zones {
zones = append(zones, &models.Zone{
Name: z.Name,
Servers: int64(z.Servers),
Name: swag.String(z.Name),
Servers: swag.Int64(int64(z.Servers)),
})
}

Expand Down Expand Up @@ -465,8 +474,8 @@ func getTenantCreatedResponse(session *models.Principal, params admin_api.Create
if len(params.Body.Zones) > 0 {
for _, zone := range params.Body.Zones {
minInst.Spec.Zones = append(minInst.Spec.Zones, operator.Zone{
Name: zone.Name,
Servers: int32(zone.Servers),
Name: *zone.Name,
Servers: int32(*zone.Servers),
})
}
}
Expand Down Expand Up @@ -544,9 +553,6 @@ func updateTenantAction(ctx context.Context, operatorClient OperatorClient, http

func getUpdateTenantResponse(session *models.Principal, params admin_api.UpdateTenantParams) error {
ctx := context.Background()
// TODO: use namespace of the tenant not from the controller
currentNamespace := cluster.GetNs()

opClientClientSet, err := cluster.OperatorClient(session.SessionToken)
if err != nil {
log.Println("error getting operator client:", err)
Expand All @@ -561,10 +567,50 @@ func getUpdateTenantResponse(session *models.Principal, params admin_api.UpdateT
Timeout: 4 * time.Second,
},
}
if err := updateTenantAction(ctx, opClient, httpC, currentNamespace, params); err != nil {
if err := updateTenantAction(ctx, opClient, httpC, params.Namespace, params); err != nil {
log.Println("error patching MinioInstance:", err)
return err
}
return nil
}

// addTenantZone creates a zone to a defined tenant
func addTenantZone(ctx context.Context, operatorClient OperatorClient, params admin_api.TenantAddZoneParams) error {
minInst, err := operatorClient.MinIOInstanceGet(ctx, params.Namespace, params.Tenant, metav1.GetOptions{})
if err != nil {
return err
}

minInst.Spec.Zones = append(minInst.Spec.Zones, operator.Zone{
Name: *params.Body.Name,
Servers: int32(*params.Body.Servers),
})

payloadBytes, err := json.Marshal(minInst)
if err != nil {
return err
}

_, err = operatorClient.MinIOInstancePatch(ctx, params.Namespace, minInst.Name, types.MergePatchType, payloadBytes, metav1.PatchOptions{})
if err != nil {
return err
}
return nil
}

func getTenantAddZoneResponse(session *models.Principal, params admin_api.TenantAddZoneParams) error {
ctx := context.Background()
opClientClientSet, err := cluster.OperatorClient(session.SessionToken)
if err != nil {
log.Println("error getting operator client:", err)
return err
}
opClient := &operatorClient{
client: opClientClientSet,
}
if err := addTenantZone(ctx, opClient, params); err != nil {
log.Println("error patching MinioInstance:", err)
return err
}
return nil
}
92 changes: 92 additions & 0 deletions restapi/admin_tenants_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import (
"reflect"
"testing"

"github.com/go-openapi/swag"
"github.com/minio/mcs/cluster"
"github.com/minio/mcs/models"
"github.com/minio/mcs/restapi/operations/admin_api"
Expand Down Expand Up @@ -299,6 +300,97 @@ func Test_deleteTenantAction(t *testing.T) {
}
}

func Test_TenantAddZone(t *testing.T) {
opClient := opClientMock{}

type args struct {
ctx context.Context
operatorClient OperatorClient
nameSpace string
mockMinioInstancePatch func(ctx context.Context, namespace string, instanceName string, pt types.PatchType, data []byte, options metav1.PatchOptions) (*v1.MinIOInstance, error)
mockMinioInstanceGet func(ctx context.Context, namespace string, instanceName string, options metav1.GetOptions) (*v1.MinIOInstance, error)
params admin_api.TenantAddZoneParams
}
tests := []struct {
name string
args args
wantErr bool
}{
{
name: "Add zone, no errors",
args: args{
ctx: context.Background(),
operatorClient: opClient,
nameSpace: "default",
mockMinioInstancePatch: func(ctx context.Context, namespace string, instanceName string, pt types.PatchType, data []byte, options metav1.PatchOptions) (*v1.MinIOInstance, error) {
return &v1.MinIOInstance{}, nil
},
mockMinioInstanceGet: func(ctx context.Context, namespace string, instanceName string, options metav1.GetOptions) (*v1.MinIOInstance, error) {
return &v1.MinIOInstance{}, nil
},
params: admin_api.TenantAddZoneParams{
Body: &models.Zone{
Name: swag.String("zone-1"),
Servers: swag.Int64(int64(4)),
},
},
},
wantErr: false,
},
{
name: "Error on patch, handle error",
args: args{
ctx: context.Background(),
operatorClient: opClient,
nameSpace: "default",
mockMinioInstancePatch: func(ctx context.Context, namespace string, instanceName string, pt types.PatchType, data []byte, options metav1.PatchOptions) (*v1.MinIOInstance, error) {
return nil, errors.New("errors")
},
mockMinioInstanceGet: func(ctx context.Context, namespace string, instanceName string, options metav1.GetOptions) (*v1.MinIOInstance, error) {
return &v1.MinIOInstance{}, nil
},
params: admin_api.TenantAddZoneParams{
Body: &models.Zone{
Name: swag.String("zone-1"),
Servers: swag.Int64(int64(4)),
},
},
},
wantErr: true,
},
{
name: "Error on get, handle error",
args: args{
ctx: context.Background(),
operatorClient: opClient,
nameSpace: "default",
mockMinioInstancePatch: func(ctx context.Context, namespace string, instanceName string, pt types.PatchType, data []byte, options metav1.PatchOptions) (*v1.MinIOInstance, error) {
return nil, errors.New("errors")
},
mockMinioInstanceGet: func(ctx context.Context, namespace string, instanceName string, options metav1.GetOptions) (*v1.MinIOInstance, error) {
return nil, errors.New("errors")
},
params: admin_api.TenantAddZoneParams{
Body: &models.Zone{
Name: swag.String("zone-1"),
Servers: swag.Int64(int64(4)),
},
},
},
wantErr: true,
},
}
for _, tt := range tests {
opClientMinioInstanceGetMock = tt.args.mockMinioInstanceGet
opClientMinioInstancePatchMock = tt.args.mockMinioInstancePatch
t.Run(tt.name, func(t *testing.T) {
if err := addTenantZone(tt.args.ctx, tt.args.operatorClient, tt.args.params); (err != nil) != tt.wantErr {
t.Errorf("addTenantZone() error = %v, wantErr %v", err, tt.wantErr)
}
})
}
}

func Test_UpdateTenantAction(t *testing.T) {
opClient := opClientMock{}
httpClientM := httpClientMock{}
Expand Down
92 changes: 92 additions & 0 deletions restapi/embedded_spec.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 44551ac

Please sign in to comment.