storj.io/minio@v0.0.0-20230509071714-0cbc90f649b1/pkg/event/name.go (about)

     1  /*
     2   * MinIO Cloud Storage, (C) 2018 MinIO, Inc.
     3   *
     4   * Licensed under the Apache License, Version 2.0 (the "License");
     5   * you may not use this file except in compliance with the License.
     6   * You may obtain a copy of the License at
     7   *
     8   *     http://www.apache.org/licenses/LICENSE-2.0
     9   *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.
    15   */
    16  
    17  package event
    18  
    19  import (
    20  	"encoding/json"
    21  	"encoding/xml"
    22  )
    23  
    24  // Name - event type enum.
    25  // Refer http://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html#notification-how-to-event-types-and-destinations
    26  // for most basic values we have since extend this and its not really much applicable other than a reference point.
    27  // "s3:Replication:OperationCompletedReplication" is a MinIO extension.
    28  type Name int
    29  
    30  // Values of event Name
    31  const (
    32  	ObjectAccessedAll Name = 1 + iota
    33  	ObjectAccessedGet
    34  	ObjectAccessedGetRetention
    35  	ObjectAccessedGetLegalHold
    36  	ObjectAccessedHead
    37  	ObjectCreatedAll
    38  	ObjectCreatedCompleteMultipartUpload
    39  	ObjectCreatedCopy
    40  	ObjectCreatedPost
    41  	ObjectCreatedPut
    42  	ObjectCreatedPutRetention
    43  	ObjectCreatedPutLegalHold
    44  	ObjectCreatedPutTagging
    45  	ObjectCreatedDeleteTagging
    46  	ObjectRemovedAll
    47  	ObjectRemovedDelete
    48  	ObjectRemovedDeleteMarkerCreated
    49  	BucketCreated
    50  	BucketRemoved
    51  	ObjectReplicationAll
    52  	ObjectReplicationFailed
    53  	ObjectReplicationComplete
    54  	ObjectReplicationMissedThreshold
    55  	ObjectReplicationReplicatedAfterThreshold
    56  	ObjectReplicationNotTracked
    57  	ObjectRestorePostInitiated
    58  	ObjectRestorePostCompleted
    59  	ObjectRestorePostAll
    60  	ObjectTransitionAll
    61  	ObjectTransitionFailed
    62  	ObjectTransitionComplete
    63  )
    64  
    65  // Expand - returns expanded values of abbreviated event type.
    66  func (name Name) Expand() []Name {
    67  	switch name {
    68  	case BucketCreated:
    69  		return []Name{BucketCreated}
    70  	case BucketRemoved:
    71  		return []Name{BucketRemoved}
    72  	case ObjectAccessedAll:
    73  		return []Name{
    74  			ObjectAccessedGet, ObjectAccessedHead,
    75  			ObjectAccessedGetRetention, ObjectAccessedGetLegalHold,
    76  		}
    77  	case ObjectCreatedAll:
    78  		return []Name{
    79  			ObjectCreatedCompleteMultipartUpload, ObjectCreatedCopy,
    80  			ObjectCreatedPost, ObjectCreatedPut,
    81  			ObjectCreatedPutRetention, ObjectCreatedPutLegalHold,
    82  			ObjectCreatedPutTagging, ObjectCreatedDeleteTagging,
    83  		}
    84  	case ObjectRemovedAll:
    85  		return []Name{
    86  			ObjectRemovedDelete,
    87  			ObjectRemovedDeleteMarkerCreated,
    88  		}
    89  	case ObjectReplicationAll:
    90  		return []Name{
    91  			ObjectReplicationFailed,
    92  			ObjectReplicationComplete,
    93  			ObjectReplicationNotTracked,
    94  			ObjectReplicationMissedThreshold,
    95  			ObjectReplicationReplicatedAfterThreshold,
    96  		}
    97  	case ObjectRestorePostAll:
    98  		return []Name{
    99  			ObjectRestorePostInitiated,
   100  			ObjectRestorePostCompleted,
   101  		}
   102  	case ObjectTransitionAll:
   103  		return []Name{
   104  			ObjectTransitionFailed,
   105  			ObjectTransitionComplete,
   106  		}
   107  	default:
   108  		return []Name{name}
   109  	}
   110  }
   111  
   112  // String - returns string representation of event type.
   113  func (name Name) String() string {
   114  	switch name {
   115  	case BucketCreated:
   116  		return "s3:BucketCreated:*"
   117  	case BucketRemoved:
   118  		return "s3:BucketRemoved:*"
   119  	case ObjectAccessedAll:
   120  		return "s3:ObjectAccessed:*"
   121  	case ObjectAccessedGet:
   122  		return "s3:ObjectAccessed:Get"
   123  	case ObjectAccessedGetRetention:
   124  		return "s3:ObjectAccessed:GetRetention"
   125  	case ObjectAccessedGetLegalHold:
   126  		return "s3:ObjectAccessed:GetLegalHold"
   127  	case ObjectAccessedHead:
   128  		return "s3:ObjectAccessed:Head"
   129  	case ObjectCreatedAll:
   130  		return "s3:ObjectCreated:*"
   131  	case ObjectCreatedCompleteMultipartUpload:
   132  		return "s3:ObjectCreated:CompleteMultipartUpload"
   133  	case ObjectCreatedCopy:
   134  		return "s3:ObjectCreated:Copy"
   135  	case ObjectCreatedPost:
   136  		return "s3:ObjectCreated:Post"
   137  	case ObjectCreatedPut:
   138  		return "s3:ObjectCreated:Put"
   139  	case ObjectCreatedPutTagging:
   140  		return "s3:ObjectCreated:PutTagging"
   141  	case ObjectCreatedDeleteTagging:
   142  		return "s3:ObjectCreated:DeleteTagging"
   143  	case ObjectCreatedPutRetention:
   144  		return "s3:ObjectCreated:PutRetention"
   145  	case ObjectCreatedPutLegalHold:
   146  		return "s3:ObjectCreated:PutLegalHold"
   147  	case ObjectRemovedAll:
   148  		return "s3:ObjectRemoved:*"
   149  	case ObjectRemovedDelete:
   150  		return "s3:ObjectRemoved:Delete"
   151  	case ObjectRemovedDeleteMarkerCreated:
   152  		return "s3:ObjectRemoved:DeleteMarkerCreated"
   153  	case ObjectReplicationAll:
   154  		return "s3:Replication:*"
   155  	case ObjectReplicationFailed:
   156  		return "s3:Replication:OperationFailedReplication"
   157  	case ObjectReplicationComplete:
   158  		return "s3:Replication:OperationCompletedReplication"
   159  	case ObjectReplicationNotTracked:
   160  		return "s3:Replication:OperationNotTracked"
   161  	case ObjectReplicationMissedThreshold:
   162  		return "s3:Replication:OperationMissedThreshold"
   163  	case ObjectReplicationReplicatedAfterThreshold:
   164  		return "s3:Replication:OperationReplicatedAfterThreshold"
   165  	case ObjectRestorePostInitiated:
   166  		return "s3:ObjectRestore:Post"
   167  	case ObjectRestorePostCompleted:
   168  		return "s3:ObjectRestore:Completed"
   169  	case ObjectTransitionAll:
   170  		return "s3:ObjectTransition:*"
   171  	case ObjectTransitionFailed:
   172  		return "s3:ObjectTransition:Failed"
   173  	case ObjectTransitionComplete:
   174  		return "s3:ObjectTransition:Complete"
   175  	}
   176  
   177  	return ""
   178  }
   179  
   180  // MarshalXML - encodes to XML data.
   181  func (name Name) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
   182  	return e.EncodeElement(name.String(), start)
   183  }
   184  
   185  // UnmarshalXML - decodes XML data.
   186  func (name *Name) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
   187  	var s string
   188  	if err := d.DecodeElement(&s, &start); err != nil {
   189  		return err
   190  	}
   191  
   192  	eventName, err := ParseName(s)
   193  	if err != nil {
   194  		return err
   195  	}
   196  
   197  	*name = eventName
   198  	return nil
   199  }
   200  
   201  // MarshalJSON - encodes to JSON data.
   202  func (name Name) MarshalJSON() ([]byte, error) {
   203  	return json.Marshal(name.String())
   204  }
   205  
   206  // UnmarshalJSON - decodes JSON data.
   207  func (name *Name) UnmarshalJSON(data []byte) error {
   208  	var s string
   209  	if err := json.Unmarshal(data, &s); err != nil {
   210  		return err
   211  	}
   212  
   213  	eventName, err := ParseName(s)
   214  	if err != nil {
   215  		return err
   216  	}
   217  
   218  	*name = eventName
   219  	return nil
   220  }
   221  
   222  // ParseName - parses string to Name.
   223  func ParseName(s string) (Name, error) {
   224  	switch s {
   225  	case "s3:BucketCreated:*":
   226  		return BucketCreated, nil
   227  	case "s3:BucketRemoved:*":
   228  		return BucketRemoved, nil
   229  	case "s3:ObjectAccessed:*":
   230  		return ObjectAccessedAll, nil
   231  	case "s3:ObjectAccessed:Get":
   232  		return ObjectAccessedGet, nil
   233  	case "s3:ObjectAccessed:GetRetention":
   234  		return ObjectAccessedGetRetention, nil
   235  	case "s3:ObjectAccessed:GetLegalHold":
   236  		return ObjectAccessedGetLegalHold, nil
   237  	case "s3:ObjectAccessed:Head":
   238  		return ObjectAccessedHead, nil
   239  	case "s3:ObjectCreated:*":
   240  		return ObjectCreatedAll, nil
   241  	case "s3:ObjectCreated:CompleteMultipartUpload":
   242  		return ObjectCreatedCompleteMultipartUpload, nil
   243  	case "s3:ObjectCreated:Copy":
   244  		return ObjectCreatedCopy, nil
   245  	case "s3:ObjectCreated:Post":
   246  		return ObjectCreatedPost, nil
   247  	case "s3:ObjectCreated:Put":
   248  		return ObjectCreatedPut, nil
   249  	case "s3:ObjectCreated:PutRetention":
   250  		return ObjectCreatedPutRetention, nil
   251  	case "s3:ObjectCreated:PutLegalHold":
   252  		return ObjectCreatedPutLegalHold, nil
   253  	case "s3:ObjectCreated:PutTagging":
   254  		return ObjectCreatedPutTagging, nil
   255  	case "s3:ObjectCreated:DeleteTagging":
   256  		return ObjectCreatedDeleteTagging, nil
   257  	case "s3:ObjectRemoved:*":
   258  		return ObjectRemovedAll, nil
   259  	case "s3:ObjectRemoved:Delete":
   260  		return ObjectRemovedDelete, nil
   261  	case "s3:ObjectRemoved:DeleteMarkerCreated":
   262  		return ObjectRemovedDeleteMarkerCreated, nil
   263  	case "s3:Replication:*":
   264  		return ObjectReplicationAll, nil
   265  	case "s3:Replication:OperationFailedReplication":
   266  		return ObjectReplicationFailed, nil
   267  	case "s3:Replication:OperationCompletedReplication":
   268  		return ObjectReplicationComplete, nil
   269  	case "s3:Replication:OperationMissedThreshold":
   270  		return ObjectReplicationMissedThreshold, nil
   271  	case "s3:Replication:OperationReplicatedAfterThreshold":
   272  		return ObjectReplicationReplicatedAfterThreshold, nil
   273  	case "s3:Replication:OperationNotTracked":
   274  		return ObjectReplicationNotTracked, nil
   275  	case "s3:ObjectRestore:*":
   276  		return ObjectRestorePostAll, nil
   277  	case "s3:ObjectRestore:Post":
   278  		return ObjectRestorePostInitiated, nil
   279  	case "s3:ObjectRestore:Completed":
   280  		return ObjectRestorePostCompleted, nil
   281  	case "s3:ObjectTransition:Failed":
   282  		return ObjectTransitionFailed, nil
   283  	case "s3:ObjectTransition:Complete":
   284  		return ObjectTransitionComplete, nil
   285  	case "s3:ObjectTransition:*":
   286  		return ObjectTransitionAll, nil
   287  	default:
   288  		return 0, &ErrInvalidEventName{s}
   289  	}
   290  }