MCPcopy
hub / github.com/NVIDIA/aistore / httpobjpost

Method httpobjpost

ais/proxy.go:1451–1522  ·  view source on GitHub ↗

POST { action } /v1/objects/bucket-name[/object-name]

(w http.ResponseWriter, r *http.Request)

Source from the content-addressed store, hash-verified

1449
1450// POST { action } /v1/objects/bucket-name[/object-name]
1451func (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}

Callers 1

objectHandlerMethod · 0.95

Calls 15

checkAccessMethod · 0.95
objMvMethod · 0.95
promoteMethod · 0.95
MorphMarshalFunction · 0.92
apiReqAllocFunction · 0.85
apiReqFreeFunction · 0.85
readActionMsgMethod · 0.80
parseReqMethod · 0.80
writeErrMethod · 0.80
writeErrActfMethod · 0.80
writeErrMsgMethod · 0.80
writeErrfMethod · 0.80

Tested by

no test coverage detected