@@ -12,7 +12,9 @@ use crate::ServerContext;
1212
1313use super :: {
1414 console_api, params,
15- views:: { Organization , Project , Rack , Role , Sled , User , Vpc , VpcSubnet } ,
15+ views:: {
16+ Organization , Project , Rack , Role , Sled , Snapshot , User , Vpc , VpcSubnet ,
17+ } ,
1618} ;
1719use crate :: context:: OpContext ;
1820use dropshot:: endpoint;
@@ -103,6 +105,11 @@ pub fn external_api() -> NexusApiDescription {
103105 api. register ( instance_disks_attach) ?;
104106 api. register ( instance_disks_detach) ?;
105107
108+ api. register ( project_snapshots_get) ?;
109+ api. register ( project_snapshots_post) ?;
110+ api. register ( project_snapshots_get_snapshot) ?;
111+ api. register ( project_snapshots_delete_snapshot) ?;
112+
106113 api. register ( project_vpcs_get) ?;
107114 api. register ( project_vpcs_post) ?;
108115 api. register ( project_vpcs_get_vpc) ?;
@@ -1261,6 +1268,148 @@ async fn instance_network_interfaces_get_interface(
12611268 apictx. external_latencies . instrument_dropshot_handler ( & rqctx, handler) . await
12621269}
12631270
1271+ /*
1272+ * Snapshots
1273+ */
1274+
1275+ /// List snapshots in a project.
1276+ #[ endpoint {
1277+ method = GET ,
1278+ path = "/organizations/{organization_name}/projects/{project_name}/snapshots" ,
1279+ tags = [ "snapshots" ] ,
1280+ } ]
1281+ async fn project_snapshots_get (
1282+ rqctx : Arc < RequestContext < Arc < ServerContext > > > ,
1283+ query_params : Query < PaginatedByName > ,
1284+ path_params : Path < ProjectPathParam > ,
1285+ ) -> Result < HttpResponseOk < ResultsPage < Snapshot > > , HttpError > {
1286+ let apictx = rqctx. context ( ) ;
1287+ let nexus = & apictx. nexus ;
1288+ let query = query_params. into_inner ( ) ;
1289+ let path = path_params. into_inner ( ) ;
1290+ let organization_name = & path. organization_name ;
1291+ let project_name = & path. project_name ;
1292+ let handler = async {
1293+ let opctx = OpContext :: for_external_api ( & rqctx) . await ?;
1294+ let snapshots = nexus
1295+ . project_list_snapshots (
1296+ & opctx,
1297+ organization_name,
1298+ project_name,
1299+ & data_page_params_for ( & rqctx, & query) ?
1300+ . map_name ( |n| Name :: ref_cast ( n) ) ,
1301+ )
1302+ . await ?
1303+ . into_iter ( )
1304+ . map ( |d| d. into ( ) )
1305+ . collect ( ) ;
1306+ Ok ( HttpResponseOk ( ScanByName :: results_page ( & query, snapshots) ?) )
1307+ } ;
1308+ apictx. external_latencies . instrument_dropshot_handler ( & rqctx, handler) . await
1309+ }
1310+
1311+ /// Create a snapshot of a disk.
1312+ #[ endpoint {
1313+ method = POST ,
1314+ path = "/organizations/{organization_name}/projects/{project_name}/snapshots" ,
1315+ tags = [ "snapshots" ] ,
1316+ } ]
1317+ async fn project_snapshots_post (
1318+ rqctx : Arc < RequestContext < Arc < ServerContext > > > ,
1319+ path_params : Path < ProjectPathParam > ,
1320+ new_snapshot : TypedBody < params:: SnapshotCreate > ,
1321+ ) -> Result < HttpResponseCreated < Snapshot > , HttpError > {
1322+ let apictx = rqctx. context ( ) ;
1323+ let nexus = & apictx. nexus ;
1324+ let path = path_params. into_inner ( ) ;
1325+ let organization_name = & path. organization_name ;
1326+ let project_name = & path. project_name ;
1327+ let new_snapshot_params = & new_snapshot. into_inner ( ) ;
1328+ let handler = async {
1329+ let opctx = OpContext :: for_external_api ( & rqctx) . await ?;
1330+ let snapshot = nexus
1331+ . project_create_snapshot (
1332+ & opctx,
1333+ & organization_name,
1334+ & project_name,
1335+ & new_snapshot_params,
1336+ )
1337+ . await ?;
1338+ Ok ( HttpResponseCreated ( snapshot. into ( ) ) )
1339+ } ;
1340+ apictx. external_latencies . instrument_dropshot_handler ( & rqctx, handler) . await
1341+ }
1342+
1343+ /// Path parameters for Snapshot requests
1344+ #[ derive( Deserialize , JsonSchema ) ]
1345+ struct SnapshotPathParam {
1346+ organization_name : Name ,
1347+ project_name : Name ,
1348+ snapshot_name : Name ,
1349+ }
1350+
1351+ /// Get a snapshot in a project.
1352+ #[ endpoint {
1353+ method = GET ,
1354+ path = "/organizations/{organization_name}/projects/{project_name}/snapshots/{snapshot_name}" ,
1355+ tags = [ "snapshots" ] ,
1356+ } ]
1357+ async fn project_snapshots_get_snapshot (
1358+ rqctx : Arc < RequestContext < Arc < ServerContext > > > ,
1359+ path_params : Path < SnapshotPathParam > ,
1360+ ) -> Result < HttpResponseOk < Snapshot > , HttpError > {
1361+ let apictx = rqctx. context ( ) ;
1362+ let nexus = & apictx. nexus ;
1363+ let path = path_params. into_inner ( ) ;
1364+ let organization_name = & path. organization_name ;
1365+ let project_name = & path. project_name ;
1366+ let snapshot_name = & path. snapshot_name ;
1367+ let handler = async {
1368+ let opctx = OpContext :: for_external_api ( & rqctx) . await ?;
1369+ let snapshot = nexus
1370+ . snapshot_fetch (
1371+ & opctx,
1372+ & organization_name,
1373+ & project_name,
1374+ & snapshot_name,
1375+ )
1376+ . await ?;
1377+ Ok ( HttpResponseOk ( snapshot. into ( ) ) )
1378+ } ;
1379+ apictx. external_latencies . instrument_dropshot_handler ( & rqctx, handler) . await
1380+ }
1381+
1382+ /// Delete a snapshot from a project.
1383+ #[ endpoint {
1384+ method = DELETE ,
1385+ path = "/organizations/{organization_name}/projects/{project_name}/snapshots/{snapshot_name}" ,
1386+ tags = [ "snapshots" ] ,
1387+ } ]
1388+ async fn project_snapshots_delete_snapshot (
1389+ rqctx : Arc < RequestContext < Arc < ServerContext > > > ,
1390+ path_params : Path < SnapshotPathParam > ,
1391+ ) -> Result < HttpResponseDeleted , HttpError > {
1392+ let apictx = rqctx. context ( ) ;
1393+ let nexus = & apictx. nexus ;
1394+ let path = path_params. into_inner ( ) ;
1395+ let organization_name = & path. organization_name ;
1396+ let project_name = & path. project_name ;
1397+ let snapshot_name = & path. snapshot_name ;
1398+ let handler = async {
1399+ let opctx = OpContext :: for_external_api ( & rqctx) . await ?;
1400+ nexus
1401+ . project_delete_snapshot (
1402+ & opctx,
1403+ & organization_name,
1404+ & project_name,
1405+ & snapshot_name,
1406+ )
1407+ . await ?;
1408+ Ok ( HttpResponseDeleted ( ) )
1409+ } ;
1410+ apictx. external_latencies . instrument_dropshot_handler ( & rqctx, handler) . await
1411+ }
1412+
12641413/*
12651414 * VPCs
12661415 */
0 commit comments