swagger:operation POST /1.0/storage-pools/{poolName}/buckets storage storage_pool_bucket_post Add a storage pool bucket. Creates a new storage pool bucket. --- consumes: - application/json produces: - application/json parameters: - in: path name: poolName description: Sto
(d *Daemon, r *http.Request)
| 638 | // "500": |
| 639 | // $ref: "#/responses/InternalServerError" |
| 640 | func storagePoolBucketsPost(d *Daemon, r *http.Request) response.Response { |
| 641 | s := d.State() |
| 642 | |
| 643 | resp := forwardedResponseIfTargetIsRemote(s, r) |
| 644 | if resp != nil { |
| 645 | return resp |
| 646 | } |
| 647 | |
| 648 | bucketProjectName, err := project.StorageBucketProject(r.Context(), s.DB.Cluster, request.ProjectParam(r)) |
| 649 | if err != nil { |
| 650 | return response.SmartError(err) |
| 651 | } |
| 652 | |
| 653 | poolName, err := pathVar(r, "poolName") |
| 654 | if err != nil { |
| 655 | return response.SmartError(err) |
| 656 | } |
| 657 | |
| 658 | if r.Header.Get("Content-Type") == "application/octet-stream" { |
| 659 | return createStoragePoolBucketFromBackup(s, r, request.ProjectParam(r), bucketProjectName, r.Body, poolName, r.Header.Get("X-Incus-name")) |
| 660 | } |
| 661 | |
| 662 | // Parse the request into a record. |
| 663 | req := api.StorageBucketsPost{} |
| 664 | err = json.NewDecoder(r.Body).Decode(&req) |
| 665 | if err != nil { |
| 666 | return response.BadRequest(err) |
| 667 | } |
| 668 | |
| 669 | pool, err := storagePools.LoadByName(s, poolName) |
| 670 | if err != nil { |
| 671 | return response.SmartError(fmt.Errorf("Failed loading storage pool: %w", err)) |
| 672 | } |
| 673 | |
| 674 | // Quick checks. |
| 675 | err = validate.IsAPIName(req.Name, false) |
| 676 | if err != nil { |
| 677 | return response.BadRequest(fmt.Errorf("Invalid storage bucket name: %w", err)) |
| 678 | } |
| 679 | |
| 680 | reverter := revert.New() |
| 681 | defer reverter.Fail() |
| 682 | |
| 683 | err = pool.CreateBucket(bucketProjectName, req, nil) |
| 684 | if err != nil { |
| 685 | return response.SmartError(fmt.Errorf("Failed creating storage bucket: %w", err)) |
| 686 | } |
| 687 | |
| 688 | reverter.Add(func() { _ = pool.DeleteBucket(bucketProjectName, req.Name, nil) }) |
| 689 | |
| 690 | // Create admin key for new bucket. |
| 691 | adminKeyReq := api.StorageBucketKeysPost{ |
| 692 | StorageBucketKeyPut: api.StorageBucketKeyPut{ |
| 693 | Role: "admin", |
| 694 | Description: "Admin user", |
| 695 | }, |
| 696 | Name: "admin", |
| 697 | } |
nothing calls this directly
no test coverage detected
searching dependent graphs…