SetRemoteTargetHandler - sets a remote target for bucket
(w http.ResponseWriter, r *http.Request)
| 150 | |
| 151 | // SetRemoteTargetHandler - sets a remote target for bucket |
| 152 | func (a adminAPIHandlers) SetRemoteTargetHandler(w http.ResponseWriter, r *http.Request) { |
| 153 | ctx := newContext(r, w, "SetBucketTarget") |
| 154 | |
| 155 | defer logger.AuditLog(ctx, w, r, mustGetClaimsFromToken(r)) |
| 156 | vars := mux.Vars(r) |
| 157 | bucket := pathClean(vars["bucket"]) |
| 158 | update := r.Form.Get("update") == "true" |
| 159 | |
| 160 | // Get current object layer instance. |
| 161 | objectAPI, _ := validateAdminReq(ctx, w, r, iampolicy.SetBucketTargetAction) |
| 162 | if objectAPI == nil { |
| 163 | return |
| 164 | } |
| 165 | |
| 166 | // Check if bucket exists. |
| 167 | if _, err := objectAPI.GetBucketInfo(ctx, bucket, BucketOptions{}); err != nil { |
| 168 | writeErrorResponseJSON(ctx, w, toAPIError(ctx, err), r.URL) |
| 169 | return |
| 170 | } |
| 171 | |
| 172 | cred, _, s3Err := validateAdminSignature(ctx, r, "") |
| 173 | if s3Err != ErrNone { |
| 174 | writeErrorResponseJSON(ctx, w, errorCodes.ToAPIErr(s3Err), r.URL) |
| 175 | return |
| 176 | } |
| 177 | password := cred.SecretKey |
| 178 | |
| 179 | reqBytes, err := madmin.DecryptData(password, io.LimitReader(r.Body, r.ContentLength)) |
| 180 | if err != nil { |
| 181 | writeErrorResponseJSON(ctx, w, errorCodes.ToAPIErrWithErr(ErrAdminConfigBadJSON, err), r.URL) |
| 182 | return |
| 183 | } |
| 184 | var target madmin.BucketTarget |
| 185 | json := jsoniter.ConfigCompatibleWithStandardLibrary |
| 186 | if err = json.Unmarshal(reqBytes, &target); err != nil { |
| 187 | writeErrorResponseJSON(ctx, w, errorCodes.ToAPIErrWithErr(ErrAdminConfigBadJSON, err), r.URL) |
| 188 | return |
| 189 | } |
| 190 | sameTarget, _ := isLocalHost(target.URL().Hostname(), target.URL().Port(), globalMinioPort) |
| 191 | if sameTarget && bucket == target.TargetBucket { |
| 192 | writeErrorResponseJSON(ctx, w, errorCodes.ToAPIErr(ErrBucketRemoteIdenticalToSource), r.URL) |
| 193 | return |
| 194 | } |
| 195 | |
| 196 | target.SourceBucket = bucket |
| 197 | var ops []madmin.TargetUpdateType |
| 198 | if update { |
| 199 | ops = madmin.GetTargetUpdateOps(r.Form) |
| 200 | } else { |
| 201 | var exists bool // true if arn exists |
| 202 | target.Arn, exists = globalBucketTargetSys.getRemoteARN(bucket, &target, "") |
| 203 | if exists && target.Arn != "" { // return pre-existing ARN |
| 204 | data, err := json.Marshal(target.Arn) |
| 205 | if err != nil { |
| 206 | writeErrorResponseJSON(ctx, w, toAdminAPIErr(ctx, err), r.URL) |
| 207 | return |
| 208 | } |
| 209 | // Write success response. |
nothing calls this directly
no test coverage detected