diff --git a/restapi/client.go b/restapi/client.go index e317b50b5f..009cd8a858 100644 --- a/restapi/client.go +++ b/restapi/client.go @@ -86,6 +86,7 @@ func (c minioClient) getBucketPolicy(bucketName string) (string, error) { // that are used within this project. type MCS3Client interface { addNotificationConfig(arn string, events []string, prefix, suffix string, ignoreExisting bool) *probe.Error + removeNotificationConfig(arn string) *probe.Error } // Interface implementation @@ -96,11 +97,16 @@ type mcS3Client struct { client *mc.S3Client } -// implements minio.ListBucketsWithContext(ctx) +// implements S3Client.AddNotificationConfig() func (c mcS3Client) addNotificationConfig(arn string, events []string, prefix, suffix string, ignoreExisting bool) *probe.Error { return c.client.AddNotificationConfig(arn, events, prefix, suffix, ignoreExisting) } +// implements S3Client.RemoveNotificationConfig() +func (c mcS3Client) removeNotificationConfig(arn string) *probe.Error { + return c.client.RemoveNotificationConfig(arn) +} + // newMinioClient creates a new MinIO client to talk to the server func newMinioClient() (*minio.Client, error) { endpoint := getMinIOEndpoint() diff --git a/restapi/embedded_spec.go b/restapi/embedded_spec.go index 4876868113..c216d04635 100644 --- a/restapi/embedded_spec.go +++ b/restapi/embedded_spec.go @@ -244,6 +244,40 @@ func init() { } } }, + "/buckets/{bucket_name}/events/{name}": { + "delete": { + "tags": [ + "UserAPI" + ], + "summary": "Delete Bucket Event", + "operationId": "DeleteBucketEvent", + "parameters": [ + { + "type": "string", + "name": "bucket_name", + "in": "path", + "required": true + }, + { + "type": "string", + "name": "name", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "A successful response." + }, + "default": { + "description": "Generic error response.", + "schema": { + "$ref": "#/definitions/error" + } + } + } + } + }, "/buckets/{name}": { "get": { "tags": [ @@ -1782,6 +1816,40 @@ func init() { } } }, + "/buckets/{bucket_name}/events/{name}": { + "delete": { + "tags": [ + "UserAPI" + ], + "summary": "Delete Bucket Event", + "operationId": "DeleteBucketEvent", + "parameters": [ + { + "type": "string", + "name": "bucket_name", + "in": "path", + "required": true + }, + { + "type": "string", + "name": "name", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "A successful response." + }, + "default": { + "description": "Generic error response.", + "schema": { + "$ref": "#/definitions/error" + } + } + } + } + }, "/buckets/{name}": { "get": { "tags": [ diff --git a/restapi/operations/mcs_api.go b/restapi/operations/mcs_api.go index b347ca3b66..4d41d6627b 100644 --- a/restapi/operations/mcs_api.go +++ b/restapi/operations/mcs_api.go @@ -93,6 +93,9 @@ func NewMcsAPI(spec *loads.Document) *McsAPI { UserAPIDeleteBucketHandler: user_api.DeleteBucketHandlerFunc(func(params user_api.DeleteBucketParams, principal *models.Principal) middleware.Responder { return middleware.NotImplemented("operation user_api.DeleteBucket has not yet been implemented") }), + UserAPIDeleteBucketEventHandler: user_api.DeleteBucketEventHandlerFunc(func(params user_api.DeleteBucketEventParams, principal *models.Principal) middleware.Responder { + return middleware.NotImplemented("operation user_api.DeleteBucketEvent has not yet been implemented") + }), AdminAPIGroupInfoHandler: admin_api.GroupInfoHandlerFunc(func(params admin_api.GroupInfoParams, principal *models.Principal) middleware.Responder { return middleware.NotImplemented("operation admin_api.GroupInfo has not yet been implemented") }), @@ -225,6 +228,8 @@ type McsAPI struct { UserAPICreateBucketEventHandler user_api.CreateBucketEventHandler // UserAPIDeleteBucketHandler sets the operation handler for the delete bucket operation UserAPIDeleteBucketHandler user_api.DeleteBucketHandler + // UserAPIDeleteBucketEventHandler sets the operation handler for the delete bucket event operation + UserAPIDeleteBucketEventHandler user_api.DeleteBucketEventHandler // AdminAPIGroupInfoHandler sets the operation handler for the group info operation AdminAPIGroupInfoHandler admin_api.GroupInfoHandler // UserAPIListBucketEventsHandler sets the operation handler for the list bucket events operation @@ -370,6 +375,9 @@ func (o *McsAPI) Validate() error { if o.UserAPIDeleteBucketHandler == nil { unregistered = append(unregistered, "user_api.DeleteBucketHandler") } + if o.UserAPIDeleteBucketEventHandler == nil { + unregistered = append(unregistered, "user_api.DeleteBucketEventHandler") + } if o.AdminAPIGroupInfoHandler == nil { unregistered = append(unregistered, "admin_api.GroupInfoHandler") } @@ -573,6 +581,10 @@ func (o *McsAPI) initHandlerCache() { o.handlers["DELETE"] = make(map[string]http.Handler) } o.handlers["DELETE"]["/buckets/{name}"] = user_api.NewDeleteBucket(o.context, o.UserAPIDeleteBucketHandler) + if o.handlers["DELETE"] == nil { + o.handlers["DELETE"] = make(map[string]http.Handler) + } + o.handlers["DELETE"]["/buckets/{bucket_name}/events/{name}"] = user_api.NewDeleteBucketEvent(o.context, o.UserAPIDeleteBucketEventHandler) if o.handlers["GET"] == nil { o.handlers["GET"] = make(map[string]http.Handler) } diff --git a/restapi/operations/user_api/delete_bucket_event.go b/restapi/operations/user_api/delete_bucket_event.go new file mode 100644 index 0000000000..a27bf5a65c --- /dev/null +++ b/restapi/operations/user_api/delete_bucket_event.go @@ -0,0 +1,90 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2020 MinIO, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . +// + +package user_api + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the generate command + +import ( + "net/http" + + "github.com/go-openapi/runtime/middleware" + + "github.com/minio/mcs/models" +) + +// DeleteBucketEventHandlerFunc turns a function with the right signature into a delete bucket event handler +type DeleteBucketEventHandlerFunc func(DeleteBucketEventParams, *models.Principal) middleware.Responder + +// Handle executing the request and returning a response +func (fn DeleteBucketEventHandlerFunc) Handle(params DeleteBucketEventParams, principal *models.Principal) middleware.Responder { + return fn(params, principal) +} + +// DeleteBucketEventHandler interface for that can handle valid delete bucket event params +type DeleteBucketEventHandler interface { + Handle(DeleteBucketEventParams, *models.Principal) middleware.Responder +} + +// NewDeleteBucketEvent creates a new http.Handler for the delete bucket event operation +func NewDeleteBucketEvent(ctx *middleware.Context, handler DeleteBucketEventHandler) *DeleteBucketEvent { + return &DeleteBucketEvent{Context: ctx, Handler: handler} +} + +/*DeleteBucketEvent swagger:route DELETE /buckets/{bucket_name}/events/{name} UserAPI deleteBucketEvent + +Delete Bucket Event + +*/ +type DeleteBucketEvent struct { + Context *middleware.Context + Handler DeleteBucketEventHandler +} + +func (o *DeleteBucketEvent) ServeHTTP(rw http.ResponseWriter, r *http.Request) { + route, rCtx, _ := o.Context.RouteInfo(r) + if rCtx != nil { + r = rCtx + } + var Params = NewDeleteBucketEventParams() + + uprinc, aCtx, err := o.Context.Authorize(r, route) + if err != nil { + o.Context.Respond(rw, r, route.Produces, route, err) + return + } + if aCtx != nil { + r = aCtx + } + var principal *models.Principal + if uprinc != nil { + principal = uprinc.(*models.Principal) // this is really a models.Principal, I promise + } + + if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params + o.Context.Respond(rw, r, route.Produces, route, err) + return + } + + res := o.Handler.Handle(Params, principal) // actually handle the request + + o.Context.Respond(rw, r, route.Produces, route, res) + +} diff --git a/restapi/operations/user_api/delete_bucket_event_parameters.go b/restapi/operations/user_api/delete_bucket_event_parameters.go new file mode 100644 index 0000000000..971273b177 --- /dev/null +++ b/restapi/operations/user_api/delete_bucket_event_parameters.go @@ -0,0 +1,114 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2020 MinIO, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . +// + +package user_api + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "net/http" + + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime/middleware" + "github.com/go-openapi/strfmt" +) + +// NewDeleteBucketEventParams creates a new DeleteBucketEventParams object +// no default values defined in spec. +func NewDeleteBucketEventParams() DeleteBucketEventParams { + + return DeleteBucketEventParams{} +} + +// DeleteBucketEventParams contains all the bound params for the delete bucket event operation +// typically these are obtained from a http.Request +// +// swagger:parameters DeleteBucketEvent +type DeleteBucketEventParams struct { + + // HTTP Request Object + HTTPRequest *http.Request `json:"-"` + + /* + Required: true + In: path + */ + BucketName string + /* + Required: true + In: path + */ + Name string +} + +// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls. +// +// To ensure default values, the struct must have been initialized with NewDeleteBucketEventParams() beforehand. +func (o *DeleteBucketEventParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { + var res []error + + o.HTTPRequest = r + + rBucketName, rhkBucketName, _ := route.Params.GetOK("bucket_name") + if err := o.bindBucketName(rBucketName, rhkBucketName, route.Formats); err != nil { + res = append(res, err) + } + + rName, rhkName, _ := route.Params.GetOK("name") + if err := o.bindName(rName, rhkName, route.Formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +// bindBucketName binds and validates parameter BucketName from path. +func (o *DeleteBucketEventParams) bindBucketName(rawData []string, hasKey bool, formats strfmt.Registry) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + // Required: true + // Parameter is provided by construction from the route + + o.BucketName = raw + + return nil +} + +// bindName binds and validates parameter Name from path. +func (o *DeleteBucketEventParams) bindName(rawData []string, hasKey bool, formats strfmt.Registry) error { + var raw string + if len(rawData) > 0 { + raw = rawData[len(rawData)-1] + } + + // Required: true + // Parameter is provided by construction from the route + + o.Name = raw + + return nil +} diff --git a/restapi/operations/user_api/delete_bucket_event_responses.go b/restapi/operations/user_api/delete_bucket_event_responses.go new file mode 100644 index 0000000000..17d083c549 --- /dev/null +++ b/restapi/operations/user_api/delete_bucket_event_responses.go @@ -0,0 +1,113 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2020 MinIO, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . +// + +package user_api + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "net/http" + + "github.com/go-openapi/runtime" + + "github.com/minio/mcs/models" +) + +// DeleteBucketEventNoContentCode is the HTTP code returned for type DeleteBucketEventNoContent +const DeleteBucketEventNoContentCode int = 204 + +/*DeleteBucketEventNoContent A successful response. + +swagger:response deleteBucketEventNoContent +*/ +type DeleteBucketEventNoContent struct { +} + +// NewDeleteBucketEventNoContent creates DeleteBucketEventNoContent with default headers values +func NewDeleteBucketEventNoContent() *DeleteBucketEventNoContent { + + return &DeleteBucketEventNoContent{} +} + +// WriteResponse to the client +func (o *DeleteBucketEventNoContent) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { + + rw.Header().Del(runtime.HeaderContentType) //Remove Content-Type on empty responses + + rw.WriteHeader(204) +} + +/*DeleteBucketEventDefault Generic error response. + +swagger:response deleteBucketEventDefault +*/ +type DeleteBucketEventDefault struct { + _statusCode int + + /* + In: Body + */ + Payload *models.Error `json:"body,omitempty"` +} + +// NewDeleteBucketEventDefault creates DeleteBucketEventDefault with default headers values +func NewDeleteBucketEventDefault(code int) *DeleteBucketEventDefault { + if code <= 0 { + code = 500 + } + + return &DeleteBucketEventDefault{ + _statusCode: code, + } +} + +// WithStatusCode adds the status to the delete bucket event default response +func (o *DeleteBucketEventDefault) WithStatusCode(code int) *DeleteBucketEventDefault { + o._statusCode = code + return o +} + +// SetStatusCode sets the status to the delete bucket event default response +func (o *DeleteBucketEventDefault) SetStatusCode(code int) { + o._statusCode = code +} + +// WithPayload adds the payload to the delete bucket event default response +func (o *DeleteBucketEventDefault) WithPayload(payload *models.Error) *DeleteBucketEventDefault { + o.Payload = payload + return o +} + +// SetPayload sets the payload to the delete bucket event default response +func (o *DeleteBucketEventDefault) SetPayload(payload *models.Error) { + o.Payload = payload +} + +// WriteResponse to the client +func (o *DeleteBucketEventDefault) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { + + rw.WriteHeader(o._statusCode) + if o.Payload != nil { + payload := o.Payload + if err := producer.Produce(rw, payload); err != nil { + panic(err) // let the recovery middleware deal with this + } + } +} diff --git a/restapi/operations/user_api/delete_bucket_event_urlbuilder.go b/restapi/operations/user_api/delete_bucket_event_urlbuilder.go new file mode 100644 index 0000000000..730c8d3605 --- /dev/null +++ b/restapi/operations/user_api/delete_bucket_event_urlbuilder.go @@ -0,0 +1,124 @@ +// Code generated by go-swagger; DO NOT EDIT. + +// This file is part of MinIO Console Server +// Copyright (c) 2020 MinIO, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . +// + +package user_api + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the generate command + +import ( + "errors" + "net/url" + golangswaggerpaths "path" + "strings" +) + +// DeleteBucketEventURL generates an URL for the delete bucket event operation +type DeleteBucketEventURL struct { + BucketName string + Name string + + _basePath string + // avoid unkeyed usage + _ struct{} +} + +// WithBasePath sets the base path for this url builder, only required when it's different from the +// base path specified in the swagger spec. +// When the value of the base path is an empty string +func (o *DeleteBucketEventURL) WithBasePath(bp string) *DeleteBucketEventURL { + o.SetBasePath(bp) + return o +} + +// SetBasePath sets the base path for this url builder, only required when it's different from the +// base path specified in the swagger spec. +// When the value of the base path is an empty string +func (o *DeleteBucketEventURL) SetBasePath(bp string) { + o._basePath = bp +} + +// Build a url path and query string +func (o *DeleteBucketEventURL) Build() (*url.URL, error) { + var _result url.URL + + var _path = "/buckets/{bucket_name}/events/{name}" + + bucketName := o.BucketName + if bucketName != "" { + _path = strings.Replace(_path, "{bucket_name}", bucketName, -1) + } else { + return nil, errors.New("bucketName is required on DeleteBucketEventURL") + } + + name := o.Name + if name != "" { + _path = strings.Replace(_path, "{name}", name, -1) + } else { + return nil, errors.New("name is required on DeleteBucketEventURL") + } + + _basePath := o._basePath + if _basePath == "" { + _basePath = "/api/v1" + } + _result.Path = golangswaggerpaths.Join(_basePath, _path) + + return &_result, nil +} + +// Must is a helper function to panic when the url builder returns an error +func (o *DeleteBucketEventURL) Must(u *url.URL, err error) *url.URL { + if err != nil { + panic(err) + } + if u == nil { + panic("url can't be nil") + } + return u +} + +// String returns the string representation of the path with query string +func (o *DeleteBucketEventURL) String() string { + return o.Must(o.Build()).String() +} + +// BuildFull builds a full url with scheme, host, path and query string +func (o *DeleteBucketEventURL) BuildFull(scheme, host string) (*url.URL, error) { + if scheme == "" { + return nil, errors.New("scheme is required for a full url on DeleteBucketEventURL") + } + if host == "" { + return nil, errors.New("host is required for a full url on DeleteBucketEventURL") + } + + base, err := o.Build() + if err != nil { + return nil, err + } + + base.Scheme = scheme + base.Host = host + return base, nil +} + +// StringFull returns the string representation of a complete url +func (o *DeleteBucketEventURL) StringFull(scheme, host string) string { + return o.Must(o.BuildFull(scheme, host)).String() +} diff --git a/restapi/user_buckets_events.go b/restapi/user_buckets_events.go index 7fe456871c..55502b75d8 100644 --- a/restapi/user_buckets_events.go +++ b/restapi/user_buckets_events.go @@ -29,6 +29,7 @@ import ( ) func registerBucketEventsHandlers(api *operations.McsAPI) { + // list bucket events api.UserAPIListBucketEventsHandler = user_api.ListBucketEventsHandlerFunc(func(params user_api.ListBucketEventsParams, principal *models.Principal) middleware.Responder { listBucketEventsResponse, err := getListBucketEventsResponse(params) if err != nil { @@ -36,12 +37,21 @@ func registerBucketEventsHandlers(api *operations.McsAPI) { } return user_api.NewListBucketEventsOK().WithPayload(listBucketEventsResponse) }) + // create bucket event api.UserAPICreateBucketEventHandler = user_api.CreateBucketEventHandlerFunc(func(params user_api.CreateBucketEventParams, principal *models.Principal) middleware.Responder { if err := getCreateBucketEventsResponse(params.BucketName, params.Body); err != nil { return user_api.NewCreateBucketEventDefault(500).WithPayload(&models.Error{Code: 500, Message: swag.String(err.Error())}) } return user_api.NewCreateBucketEventCreated() }) + // delete bucket event + api.UserAPIDeleteBucketEventHandler = user_api.DeleteBucketEventHandlerFunc(func(params user_api.DeleteBucketEventParams, principal *models.Principal) middleware.Responder { + if err := getDeleteBucketEventsResponse(params.BucketName, params.Name); err != nil { + return user_api.NewDeleteBucketEventDefault(500).WithPayload(&models.Error{Code: 500, Message: swag.String(err.Error())}) + } + return user_api.NewDeleteBucketEventNoContent() + }) + } // listBucketEvents fetches a list of all events set for a bucket and serializes them for a proper output @@ -170,10 +180,10 @@ func createBucketEvent(client MCS3Client, arn string, notificationEvents []model func getCreateBucketEventsResponse(bucketName string, eventReq *models.BucketEventRequest) error { s3Client, err := newS3BucketClient(swag.String(bucketName)) if err != nil { - log.Println("error creating MinIO Client:", err) + log.Println("error creating S3Client:", err) return err } - // create a minioClient interface implementation + // create a mc S3Client interface implementation // defining the client to be used mcS3Client := mcS3Client{client: s3Client} err = createBucketEvent(mcS3Client, *eventReq.Configuration.Arn, eventReq.Configuration.Events, eventReq.Configuration.Prefix, eventReq.Configuration.Suffix, eventReq.IgnoreExisting) @@ -183,3 +193,30 @@ func getCreateBucketEventsResponse(bucketName string, eventReq *models.BucketEve } return nil } + +// deleteBucketEventNotification calls S3Client.RemoveNotificationConfig to remove a bucket event notification +func deleteBucketEventNotification(client MCS3Client, arn string) error { + perr := client.removeNotificationConfig(arn) + if perr != nil { + return perr.Cause + } + return nil +} + +// getDeleteBucketEventsResponse calls deleteBucketEventNotification() to delete a bucket event notification +func getDeleteBucketEventsResponse(bucketName string, arn string) error { + s3Client, err := newS3BucketClient(swag.String(bucketName)) + if err != nil { + log.Println("error creating S3Client:", err) + return err + } + // create a mc S3Client interface implementation + // defining the client to be used + mcS3Client := mcS3Client{client: s3Client} + err = deleteBucketEventNotification(mcS3Client, arn) + if err != nil { + log.Println("error deleting bucket event:", err) + return err + } + return nil +} diff --git a/restapi/user_buckets_events_test.go b/restapi/user_buckets_events_test.go index a17f28bc02..e6e7ca9b02 100644 --- a/restapi/user_buckets_events_test.go +++ b/restapi/user_buckets_events_test.go @@ -39,16 +39,22 @@ func (mc minioClientMock) getBucketNotification(bucketName string) (bucketNotifi //// Mock mc S3Client functions //// var mcAddNotificationConfigMock func(arn string, events []string, prefix, suffix string, ignoreExisting bool) *probe.Error +var mcRemoveNotificationConfigMock func(arn string) *probe.Error // Define a mock struct of mc S3Client interface implementation type s3ClientMock struct { } -// implements mc.S3Client.AddNotificationConfigMock(ctx) +// implements mc.S3Client.AddNotificationConfigMock() func (c s3ClientMock) addNotificationConfig(arn string, events []string, prefix, suffix string, ignoreExisting bool) *probe.Error { return mcAddNotificationConfigMock(arn, events, prefix, suffix, ignoreExisting) } +// implements mc.S3Client.DeleteBucketEventNotification() +func (c s3ClientMock) removeNotificationConfig(arn string) *probe.Error { + return mcRemoveNotificationConfigMock(arn) +} + func TestAddBucketNotification(t *testing.T) { assert := assert.New(t) // mock minIO client @@ -92,6 +98,29 @@ func TestAddBucketNotification(t *testing.T) { } } +func TestDeleteBucketNotification(t *testing.T) { + assert := assert.New(t) + // mock minIO client + client := s3ClientMock{} + function := "deleteBucketEventNotification()" + // Test-1: deleteBucketEventNotification() delete a bucket event notification + testArn := "arn:minio:sqs::test:postgresql" + mcRemoveNotificationConfigMock = func(arn string) *probe.Error { + return nil + } + if err := deleteBucketEventNotification(client, testArn); err != nil { + t.Errorf("Failed on %s:, error occurred: %s", function, err.Error()) + } + + // Test-3 deleteBucketEventNotification() S3Client.DeleteBucketEventNotification returns an error and is handled correctly + mcRemoveNotificationConfigMock = func(arn string) *probe.Error { + return probe.NewError(errors.New("error")) + } + if err := deleteBucketEventNotification(client, testArn); assert.Error(err) { + assert.Equal("error", err.Error()) + } +} + func TestListBucketEvents(t *testing.T) { assert := assert.New(t) // mock minIO client diff --git a/swagger.yml b/swagger.yml index d6a1ce0e7a..db35229ada 100644 --- a/swagger.yml +++ b/swagger.yml @@ -182,6 +182,28 @@ paths: $ref: "#/definitions/error" tags: - UserAPI + /buckets/{bucket_name}/events/{name}: + delete: + summary: Delete Bucket Event + operationId: DeleteBucketEvent + parameters: + - name: bucket_name + in: path + required: true + type: string + - name: name + in: path + required: true + type: string + responses: + 204: + description: A successful response. + default: + description: Generic error response. + schema: + $ref: "#/definitions/error" + tags: + - UserAPI /users: get: summary: List Users