@@ -313,6 +313,46 @@ public Page<Image> nextPage() {
313313 }
314314 }
315315
316+ private static class DiskPageFetcher implements NextPageFetcher <Disk > {
317+
318+ private static final long serialVersionUID = 4146589787872718476L ;
319+ private final Map <ComputeRpc .Option , ?> requestOptions ;
320+ private final ComputeOptions serviceOptions ;
321+ private final String zone ;
322+
323+ DiskPageFetcher (String zone , ComputeOptions serviceOptions , String cursor ,
324+ Map <ComputeRpc .Option , ?> optionMap ) {
325+ this .requestOptions =
326+ PageImpl .nextRequestOptions (ComputeRpc .Option .PAGE_TOKEN , cursor , optionMap );
327+ this .serviceOptions = serviceOptions ;
328+ this .zone = zone ;
329+ }
330+
331+ @ Override
332+ public Page <Disk > nextPage () {
333+ return listDisks (zone , serviceOptions , requestOptions );
334+ }
335+ }
336+
337+ private static class AggregatedDiskPageFetcher implements NextPageFetcher <Disk > {
338+
339+ private static final long serialVersionUID = -5240045334115926206L ;
340+ private final Map <ComputeRpc .Option , ?> requestOptions ;
341+ private final ComputeOptions serviceOptions ;
342+
343+ AggregatedDiskPageFetcher (ComputeOptions serviceOptions , String cursor ,
344+ Map <ComputeRpc .Option , ?> optionMap ) {
345+ this .requestOptions =
346+ PageImpl .nextRequestOptions (ComputeRpc .Option .PAGE_TOKEN , cursor , optionMap );
347+ this .serviceOptions = serviceOptions ;
348+ }
349+
350+ @ Override
351+ public Page <Disk > nextPage () {
352+ return listDisks (serviceOptions , requestOptions );
353+ }
354+ }
355+
316356 private final ComputeRpc computeRpc ;
317357
318358 ComputeImpl (ComputeOptions options ) {
@@ -1161,6 +1201,124 @@ public com.google.api.services.compute.model.Operation call() {
11611201 }
11621202 }
11631203
1204+ @ Override
1205+ public Disk get (final DiskId diskId , DiskOption ... options ) {
1206+ final Map <ComputeRpc .Option , ?> optionsMap = optionMap (options );
1207+ try {
1208+ com .google .api .services .compute .model .Disk answer =
1209+ runWithRetries (new Callable <com .google .api .services .compute .model .Disk >() {
1210+ @ Override
1211+ public com .google .api .services .compute .model .Disk call () {
1212+ return computeRpc .getDisk (diskId .zone (), diskId .disk (), optionsMap );
1213+ }
1214+ }, options ().retryParams (), EXCEPTION_HANDLER );
1215+ return answer == null ? null : Disk .fromPb (this , answer );
1216+ } catch (RetryHelper .RetryHelperException e ) {
1217+ throw ComputeException .translateAndThrow (e );
1218+ }
1219+ }
1220+
1221+ @ Override
1222+ public Operation create (final DiskInfo disk , OperationOption ... options ) {
1223+ final com .google .api .services .compute .model .Disk diskPb =
1224+ disk .setProjectId (options ().projectId ()).toPb ();
1225+ final Map <ComputeRpc .Option , ?> optionsMap = optionMap (options );
1226+ try {
1227+ return Operation .fromPb (this ,
1228+ runWithRetries (new Callable <com .google .api .services .compute .model .Operation >() {
1229+ @ Override
1230+ public com .google .api .services .compute .model .Operation call () {
1231+ return computeRpc .createDisk (disk .diskId ().zone (), diskPb , optionsMap );
1232+ }
1233+ }, options ().retryParams (), EXCEPTION_HANDLER ));
1234+ } catch (RetryHelper .RetryHelperException e ) {
1235+ throw ComputeException .translateAndThrow (e );
1236+ }
1237+ }
1238+
1239+ private static Function <com .google .api .services .compute .model .Disk , Disk > diskFromPb (
1240+ final ComputeOptions serviceOptions ) {
1241+ return new Function <com .google .api .services .compute .model .Disk , Disk >() {
1242+ @ Override
1243+ public Disk apply (com .google .api .services .compute .model .Disk disk ) {
1244+ return Disk .fromPb (serviceOptions .service (), disk );
1245+ }
1246+ };
1247+ }
1248+
1249+ @ Override
1250+ public Page <Disk > listDisks (String zone , DiskListOption ... options ) {
1251+ return listDisks (zone , options (), optionMap (options ));
1252+ }
1253+
1254+ private static Page <Disk > listDisks (final String zone , final ComputeOptions serviceOptions ,
1255+ final Map <ComputeRpc .Option , ?> optionsMap ) {
1256+ try {
1257+ ComputeRpc .Tuple <String , Iterable <com .google .api .services .compute .model .Disk >> result =
1258+ runWithRetries (new Callable <ComputeRpc .Tuple <String ,
1259+ Iterable <com .google .api .services .compute .model .Disk >>>() {
1260+ @ Override
1261+ public ComputeRpc .Tuple <String ,
1262+ Iterable <com .google .api .services .compute .model .Disk >> call () {
1263+ return serviceOptions .rpc ().listDisks (zone , optionsMap );
1264+ }
1265+ }, serviceOptions .retryParams (), EXCEPTION_HANDLER );
1266+ String cursor = result .x ();
1267+ Iterable <Disk > disks = Iterables .transform (
1268+ result .y () == null ? ImmutableList .<com .google .api .services .compute .model .Disk >of ()
1269+ : result .y (), diskFromPb (serviceOptions ));
1270+ return new PageImpl <>(new DiskPageFetcher (zone , serviceOptions , cursor , optionsMap ),
1271+ cursor , disks );
1272+ } catch (RetryHelper .RetryHelperException e ) {
1273+ throw ComputeException .translateAndThrow (e );
1274+ }
1275+ }
1276+
1277+ @ Override
1278+ public Page <Disk > listDisks (DiskAggregatedListOption ... options ) {
1279+ return listDisks (options (), optionMap (options ));
1280+ }
1281+
1282+ private static Page <Disk > listDisks (final ComputeOptions serviceOptions ,
1283+ final Map <ComputeRpc .Option , ?> optionsMap ) {
1284+ try {
1285+ ComputeRpc .Tuple <String , Iterable <com .google .api .services .compute .model .Disk >> result =
1286+ runWithRetries (new Callable <ComputeRpc .Tuple <String ,
1287+ Iterable <com .google .api .services .compute .model .Disk >>>() {
1288+ @ Override
1289+ public ComputeRpc .Tuple <String ,
1290+ Iterable <com .google .api .services .compute .model .Disk >> call () {
1291+ return serviceOptions .rpc ().listDisks (optionsMap );
1292+ }
1293+ }, serviceOptions .retryParams (), EXCEPTION_HANDLER );
1294+ String cursor = result .x ();
1295+ Iterable <Disk > disks = Iterables .transform (
1296+ result .y () == null ? ImmutableList .<com .google .api .services .compute .model .Disk >of ()
1297+ : result .y (), diskFromPb (serviceOptions ));
1298+ return new PageImpl <>(new AggregatedDiskPageFetcher (serviceOptions , cursor , optionsMap ),
1299+ cursor , disks );
1300+ } catch (RetryHelper .RetryHelperException e ) {
1301+ throw ComputeException .translateAndThrow (e );
1302+ }
1303+ }
1304+
1305+ @ Override
1306+ public Operation delete (final DiskId disk , OperationOption ... options ) {
1307+ final Map <ComputeRpc .Option , ?> optionsMap = optionMap (options );
1308+ try {
1309+ com .google .api .services .compute .model .Operation answer =
1310+ runWithRetries (new Callable <com .google .api .services .compute .model .Operation >() {
1311+ @ Override
1312+ public com .google .api .services .compute .model .Operation call () {
1313+ return computeRpc .deleteDisk (disk .zone (), disk .disk (), optionsMap );
1314+ }
1315+ }, options ().retryParams (), EXCEPTION_HANDLER );
1316+ return answer == null ? null : Operation .fromPb (this , answer );
1317+ } catch (RetryHelper .RetryHelperException e ) {
1318+ throw ComputeException .translateAndThrow (e );
1319+ }
1320+ }
1321+
11641322 private Map <ComputeRpc .Option , ?> optionMap (Option ... options ) {
11651323 Map <ComputeRpc .Option , Object > optionMap = Maps .newEnumMap (ComputeRpc .Option .class );
11661324 for (Option option : options ) {
0 commit comments