POST { action } /v1/objects/bucket-name[/object-name]
(w http.ResponseWriter, r *http.Request)
| 1449 | |
| 1450 | // POST { action } /v1/objects/bucket-name[/object-name] |
| 1451 | func (p *proxy) httpobjpost(w http.ResponseWriter, r *http.Request) { |
| 1452 | msg, err := p.readActionMsg(w, r) |
| 1453 | if err != nil { |
| 1454 | return |
| 1455 | } |
| 1456 | apireq := apiReqAlloc(1, apc.URLPathObjects.L, false) |
| 1457 | defer apiReqFree(apireq) |
| 1458 | if msg.Action == apc.ActRenameObject { |
| 1459 | apireq.after = 2 |
| 1460 | } |
| 1461 | if err := p.parseReq(w, r, apireq); err != nil { |
| 1462 | return |
| 1463 | } |
| 1464 | |
| 1465 | // TODO: revisit versus remote bucket not being present, see p.tryBckInit |
| 1466 | bck := apireq.bck |
| 1467 | if err := bck.Init(p.owner.bmd); err != nil { |
| 1468 | p.writeErr(w, r, err) |
| 1469 | return |
| 1470 | } |
| 1471 | switch msg.Action { |
| 1472 | case apc.ActRenameObject: |
| 1473 | if err := p.checkAccess(w, r, bck, apc.AceObjMOVE); err != nil { |
| 1474 | return |
| 1475 | } |
| 1476 | if bck.IsRemote() { |
| 1477 | p.writeErrActf(w, r, msg.Action, "not supported for remote buckets (%s)", bck) |
| 1478 | return |
| 1479 | } |
| 1480 | if bck.Props.EC.Enabled { |
| 1481 | p.writeErrActf(w, r, msg.Action, "not supported for erasure-coded buckets (%s)", bck) |
| 1482 | return |
| 1483 | } |
| 1484 | p.objMv(w, r, bck, apireq.items[1], msg) |
| 1485 | return |
| 1486 | case apc.ActPromote: |
| 1487 | if err := p.checkAccess(w, r, bck, apc.AcePromote); err != nil { |
| 1488 | return |
| 1489 | } |
| 1490 | // ActionMsg.Name is the source |
| 1491 | if !filepath.IsAbs(msg.Name) { |
| 1492 | if msg.Name == "" { |
| 1493 | p.writeErrMsg(w, r, "promoted source pathname is empty") |
| 1494 | } else { |
| 1495 | p.writeErrf(w, r, "promoted source must be an absolute path (got %q)", msg.Name) |
| 1496 | } |
| 1497 | return |
| 1498 | } |
| 1499 | args := &cluster.PromoteArgs{} |
| 1500 | if err := cos.MorphMarshal(msg.Value, args); err != nil { |
| 1501 | p.writeErrf(w, r, cmn.FmtErrMorphUnmarshal, p.si, msg.Action, msg.Value, err) |
| 1502 | return |
| 1503 | } |
| 1504 | var tsi *cluster.Snode |
| 1505 | if args.DaemonID != "" { |
| 1506 | smap := p.owner.smap.get() |
| 1507 | if tsi = smap.GetTarget(args.DaemonID); tsi == nil { |
| 1508 | err := &errNodeNotFound{apc.ActPromote + " failure", args.DaemonID, p.si, smap} |
no test coverage detected