MCPcopy
hub / github.com/lxc/incus / doVolumeCreateOrCopy

Function doVolumeCreateOrCopy

cmd/incusd/storage_volumes.go:1073–1125  ·  view source on GitHub ↗
(s *state.State, r *http.Request, requestProjectName string, projectName string, poolName string, req *api.StorageVolumesPost)

Source from the content-addressed store, hash-verified

1071}
1072
1073func doVolumeCreateOrCopy(s *state.State, r *http.Request, requestProjectName string, projectName string, poolName string, req *api.StorageVolumesPost) response.Response {
1074 pool, err := storagePools.LoadByName(s, poolName)
1075 if err != nil {
1076 return response.SmartError(err)
1077 }
1078
1079 var srcProjectName string
1080 if req.Source.Project != "" {
1081 srcProjectName, err = project.StorageVolumeProject(s.DB.Cluster, req.Source.Project, db.StoragePoolVolumeTypeCustom)
1082 if err != nil {
1083 return response.SmartError(err)
1084 }
1085 }
1086
1087 volumeDBContentType, err := storagePools.VolumeContentTypeNameToContentType(req.ContentType)
1088 if err != nil {
1089 return response.SmartError(err)
1090 }
1091
1092 contentType, err := storagePools.VolumeDBContentTypeToContentType(volumeDBContentType)
1093 if err != nil {
1094 return response.SmartError(err)
1095 }
1096
1097 run := func(op *operations.Operation) error {
1098 if req.Source.Name == "" {
1099 // Use an empty operation for this sync response to pass the requestor
1100 op := &operations.Operation{}
1101 op.SetRequestor(r)
1102 return pool.CreateCustomVolume(projectName, req.Name, req.Description, req.Config, contentType, op)
1103 }
1104
1105 return pool.CreateCustomVolumeFromCopy(projectName, srcProjectName, req.Name, req.Description, req.Config, req.Source.Pool, req.Source.Name, !req.Source.VolumeOnly, op)
1106 }
1107
1108 // If no source name supplied then this a volume create operation.
1109 if req.Source.Name == "" {
1110 err := run(nil)
1111 if err != nil {
1112 return response.SmartError(err)
1113 }
1114
1115 return response.EmptySyncResponse
1116 }
1117
1118 // Volume copy operations potentially take a long time, so run as an async operation.
1119 op, err := operations.OperationCreate(s, requestProjectName, operations.OperationClassTask, operationtype.VolumeCopy, nil, nil, run, nil, nil, r)
1120 if err != nil {
1121 return response.InternalError(err)
1122 }
1123
1124 return operations.OperationResponse(op)
1125}
1126
1127func doVolumeMigration(s *state.State, r *http.Request, requestProjectName string, projectName string, poolName string, req *api.StorageVolumesPost) response.Response {
1128 // Validate migration mode

Callers 1

storagePoolVolumesPostFunction · 0.85

Calls 9

SetRequestorMethod · 0.95
SmartErrorFunction · 0.92
StorageVolumeProjectFunction · 0.92
OperationCreateFunction · 0.92
InternalErrorFunction · 0.92
OperationResponseFunction · 0.92
runFunction · 0.85
CreateCustomVolumeMethod · 0.65

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…