gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

api-restore.go (5788B)


      1 /*
      2  * MinIO Go Library for Amazon S3 Compatible Cloud Storage
      3  * (C) 2018-2021 MinIO, Inc.
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at
      8  *
      9  *     http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  */
     17 
     18 package minio
     19 
     20 import (
     21 	"bytes"
     22 	"context"
     23 	"encoding/xml"
     24 	"net/http"
     25 	"net/url"
     26 
     27 	"github.com/minio/minio-go/v7/pkg/s3utils"
     28 	"github.com/minio/minio-go/v7/pkg/tags"
     29 )
     30 
     31 // RestoreType represents the restore request type
     32 type RestoreType string
     33 
     34 const (
     35 	// RestoreSelect represents the restore SELECT operation
     36 	RestoreSelect = RestoreType("SELECT")
     37 )
     38 
     39 // TierType represents a retrieval tier
     40 type TierType string
     41 
     42 const (
     43 	// TierStandard is the standard retrieval tier
     44 	TierStandard = TierType("Standard")
     45 	// TierBulk is the bulk retrieval tier
     46 	TierBulk = TierType("Bulk")
     47 	// TierExpedited is the expedited retrieval tier
     48 	TierExpedited = TierType("Expedited")
     49 )
     50 
     51 // GlacierJobParameters represents the retrieval tier parameter
     52 type GlacierJobParameters struct {
     53 	Tier TierType
     54 }
     55 
     56 // Encryption contains the type of server-side encryption used during object retrieval
     57 type Encryption struct {
     58 	EncryptionType string
     59 	KMSContext     string
     60 	KMSKeyID       string `xml:"KMSKeyId"`
     61 }
     62 
     63 // MetadataEntry represents a metadata information of the restored object.
     64 type MetadataEntry struct {
     65 	Name  string
     66 	Value string
     67 }
     68 
     69 // S3 holds properties of the copy of the archived object
     70 type S3 struct {
     71 	AccessControlList *AccessControlList `xml:"AccessControlList,omitempty"`
     72 	BucketName        string
     73 	Prefix            string
     74 	CannedACL         *string        `xml:"CannedACL,omitempty"`
     75 	Encryption        *Encryption    `xml:"Encryption,omitempty"`
     76 	StorageClass      *string        `xml:"StorageClass,omitempty"`
     77 	Tagging           *tags.Tags     `xml:"Tagging,omitempty"`
     78 	UserMetadata      *MetadataEntry `xml:"UserMetadata,omitempty"`
     79 }
     80 
     81 // SelectParameters holds the select request parameters
     82 type SelectParameters struct {
     83 	XMLName             xml.Name `xml:"SelectParameters"`
     84 	ExpressionType      QueryExpressionType
     85 	Expression          string
     86 	InputSerialization  SelectObjectInputSerialization
     87 	OutputSerialization SelectObjectOutputSerialization
     88 }
     89 
     90 // OutputLocation holds properties of the copy of the archived object
     91 type OutputLocation struct {
     92 	XMLName xml.Name `xml:"OutputLocation"`
     93 	S3      S3       `xml:"S3"`
     94 }
     95 
     96 // RestoreRequest holds properties of the restore object request
     97 type RestoreRequest struct {
     98 	XMLName              xml.Name              `xml:"http://s3.amazonaws.com/doc/2006-03-01/ RestoreRequest"`
     99 	Type                 *RestoreType          `xml:"Type,omitempty"`
    100 	Tier                 *TierType             `xml:"Tier,omitempty"`
    101 	Days                 *int                  `xml:"Days,omitempty"`
    102 	GlacierJobParameters *GlacierJobParameters `xml:"GlacierJobParameters,omitempty"`
    103 	Description          *string               `xml:"Description,omitempty"`
    104 	SelectParameters     *SelectParameters     `xml:"SelectParameters,omitempty"`
    105 	OutputLocation       *OutputLocation       `xml:"OutputLocation,omitempty"`
    106 }
    107 
    108 // SetDays sets the days parameter of the restore request
    109 func (r *RestoreRequest) SetDays(v int) {
    110 	r.Days = &v
    111 }
    112 
    113 // SetGlacierJobParameters sets the GlacierJobParameters of the restore request
    114 func (r *RestoreRequest) SetGlacierJobParameters(v GlacierJobParameters) {
    115 	r.GlacierJobParameters = &v
    116 }
    117 
    118 // SetType sets the type of the restore request
    119 func (r *RestoreRequest) SetType(v RestoreType) {
    120 	r.Type = &v
    121 }
    122 
    123 // SetTier sets the retrieval tier of the restore request
    124 func (r *RestoreRequest) SetTier(v TierType) {
    125 	r.Tier = &v
    126 }
    127 
    128 // SetDescription sets the description of the restore request
    129 func (r *RestoreRequest) SetDescription(v string) {
    130 	r.Description = &v
    131 }
    132 
    133 // SetSelectParameters sets SelectParameters of the restore select request
    134 func (r *RestoreRequest) SetSelectParameters(v SelectParameters) {
    135 	r.SelectParameters = &v
    136 }
    137 
    138 // SetOutputLocation sets the properties of the copy of the archived object
    139 func (r *RestoreRequest) SetOutputLocation(v OutputLocation) {
    140 	r.OutputLocation = &v
    141 }
    142 
    143 // RestoreObject is a implementation of https://docs.aws.amazon.com/AmazonS3/latest/API/API_RestoreObject.html AWS S3 API
    144 func (c *Client) RestoreObject(ctx context.Context, bucketName, objectName, versionID string, req RestoreRequest) error {
    145 	// Input validation.
    146 	if err := s3utils.CheckValidBucketName(bucketName); err != nil {
    147 		return err
    148 	}
    149 	if err := s3utils.CheckValidObjectName(objectName); err != nil {
    150 		return err
    151 	}
    152 
    153 	restoreRequestBytes, err := xml.Marshal(req)
    154 	if err != nil {
    155 		return err
    156 	}
    157 
    158 	urlValues := make(url.Values)
    159 	urlValues.Set("restore", "")
    160 	if versionID != "" {
    161 		urlValues.Set("versionId", versionID)
    162 	}
    163 
    164 	// Execute POST on bucket/object.
    165 	resp, err := c.executeMethod(ctx, http.MethodPost, requestMetadata{
    166 		bucketName:       bucketName,
    167 		objectName:       objectName,
    168 		queryValues:      urlValues,
    169 		contentMD5Base64: sumMD5Base64(restoreRequestBytes),
    170 		contentSHA256Hex: sum256Hex(restoreRequestBytes),
    171 		contentBody:      bytes.NewReader(restoreRequestBytes),
    172 		contentLength:    int64(len(restoreRequestBytes)),
    173 	})
    174 	defer closeResponse(resp)
    175 	if err != nil {
    176 		return err
    177 	}
    178 	if resp.StatusCode != http.StatusAccepted && resp.StatusCode != http.StatusOK {
    179 		return httpRespToErrorResponse(resp, bucketName, "")
    180 	}
    181 	return nil
    182 }