diff --git a/compute/reservations/createReservationFromProperties.js b/compute/reservations/createReservationFromProperties.js index a21bdccee6..42e23755e8 100644 --- a/compute/reservations/createReservationFromProperties.js +++ b/compute/reservations/createReservationFromProperties.js @@ -30,7 +30,7 @@ async function main() { /** * TODO(developer): Update these variables before running the sample. */ - // The ID of the project where you want to reserve resources and where the instance template exists. + // The ID of the project where you want to reserve resources. const projectId = await reservationsClient.getProjectId(); // The zone in which to reserve resources. const zone = 'us-central1-a'; diff --git a/compute/reservations/deleteReservation.js b/compute/reservations/deleteReservation.js new file mode 100644 index 0000000000..0c13b49f11 --- /dev/null +++ b/compute/reservations/deleteReservation.js @@ -0,0 +1,60 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict'; +async function main() { + // [START compute_reservation_delete] + // Import the Compute library + const computeLib = require('@google-cloud/compute'); + // Instantiate a reservationsClient + const reservationsClient = new computeLib.ReservationsClient(); + // Instantiate a zoneOperationsClient + const zoneOperationsClient = new computeLib.ZoneOperationsClient(); + /** + * TODO(developer): Update these variables before running the sample. + */ + // The ID of the project where your reservation is located. + const projectId = await reservationsClient.getProjectId(); + // The zone where your reservation is located. + const zone = 'us-central1-a'; + // The name of the reservation to delete. + const reservationName = 'reservation-01'; + + async function callDeleteReservation() { + // Delete the reservation + const [response] = await reservationsClient.delete({ + project: projectId, + reservation: reservationName, + zone, + }); + + let operation = response.latestResponse; + + // Wait for the delete reservation operation to complete. + while (operation.status !== 'DONE') { + [operation] = await zoneOperationsClient.wait({ + operation: operation.name, + project: projectId, + zone: operation.zone.split('/').pop(), + }); + } + } + await callDeleteReservation(); + // [END compute_reservation_delete] +} +main().catch(err => { + console.error(err); + process.exitCode = 1; +}); diff --git a/compute/reservations/getReservation.js b/compute/reservations/getReservation.js new file mode 100644 index 0000000000..733090ae6d --- /dev/null +++ b/compute/reservations/getReservation.js @@ -0,0 +1,56 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +async function main() { + // [START compute_reservation_get] + // Import the Compute library + const computeLib = require('@google-cloud/compute'); + + // Instantiate a reservationsClient + const reservationsClient = new computeLib.ReservationsClient(); + + /** + * TODO(developer): Update these variables before running the sample. + */ + // The ID of the project where your reservation is located. + const projectId = await reservationsClient.getProjectId(); + // The zone where your reservation is located. + const zone = 'us-central1-a'; + // The name of the reservation to return. + const reservationName = 'reservation-01'; + + async function callGetReservation() { + const requestedReservation = ( + await reservationsClient.get({ + project: projectId, + zone, + reservation: reservationName, + }) + )[0]; + + console.log(JSON.stringify(requestedReservation)); + } + + await callGetReservation(); + // [END compute_reservation_get] +} + +main().catch(err => { + console.error(err); + process.exitCode = 1; +}); diff --git a/compute/reservations/getReservations.js b/compute/reservations/getReservations.js new file mode 100644 index 0000000000..69f6f095b2 --- /dev/null +++ b/compute/reservations/getReservations.js @@ -0,0 +1,53 @@ +/* + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +async function main() { + // [START compute_reservation_list] + // Import the Compute library + const computeLib = require('@google-cloud/compute'); + + // Instantiate a reservationsClient + const reservationsClient = new computeLib.ReservationsClient(); + + /** + * TODO(developer): Update these variables before running the sample. + */ + // The ID of the project where your reservations are located. + const projectId = await reservationsClient.getProjectId(); + // The zone where your reservations are located. + const zone = 'us-central1-a'; + + async function callGetReservations() { + const reservations = ( + await reservationsClient.list({ + project: projectId, + zone, + }) + )[0]; + + console.log(JSON.stringify(reservations)); + } + + await callGetReservations(); + // [END compute_reservation_list] +} + +main().catch(err => { + console.error(err); + process.exitCode = 1; +}); diff --git a/compute/test/createReservationFromProperties.test.js b/compute/test/reservations.test.js similarity index 58% rename from compute/test/createReservationFromProperties.test.js rename to compute/test/reservations.test.js index 9c7512bf7d..bcbec555fe 100644 --- a/compute/test/createReservationFromProperties.test.js +++ b/compute/test/reservations.test.js @@ -18,31 +18,25 @@ const path = require('path'); const assert = require('node:assert/strict'); -const {after, before, describe, it} = require('mocha'); +const {describe, it} = require('mocha'); +const {expect} = require('chai'); const cp = require('child_process'); const {ReservationsClient} = require('@google-cloud/compute').v1; const execSync = cmd => cp.execSync(cmd, {encoding: 'utf-8'}); const cwd = path.join(__dirname, '..'); -describe('Create compute reservation by specyfing properties directly', async () => { +describe('Compute reservation', async () => { const reservationName = 'reservation-01'; const zone = 'us-central1-a'; const reservationsClient = new ReservationsClient(); let projectId; + let reservation; before(async () => { projectId = await reservationsClient.getProjectId(); }); - after(async () => { - await reservationsClient.delete({ - project: projectId, - reservation: reservationName, - zone, - }); - }); - it('should create a new reservation', () => { const instanceProperties = { _machineType: 'machineType', @@ -67,17 +61,60 @@ describe('Create compute reservation by specyfing properties directly', async () minCpuPlatform: 'Intel Skylake', }; - const response = JSON.parse( + reservation = JSON.parse( execSync('node ./reservations/createReservationFromProperties.js', { cwd, }) ); - assert.equal(response.name, reservationName); - assert.equal(response.specificReservation.count, '3'); + assert.equal(reservation.name, reservationName); + assert.equal(reservation.specificReservation.count, '3'); assert.deepEqual( - response.specificReservation.instanceProperties, + reservation.specificReservation.instanceProperties, instanceProperties ); }); + + it('should return reservation', () => { + const response = JSON.parse( + execSync('node ./reservations/getReservation.js', { + cwd, + }) + ); + + assert.deepEqual(response, reservation); + }); + + it('should return list of reservations', () => { + const response = JSON.parse( + execSync('node ./reservations/getReservations.js', { + cwd, + }) + ); + + assert.deepEqual(response, [reservation]); + }); + + it('should delete reservation', async () => { + execSync('node ./reservations/deleteReservation.js', { + cwd, + }); + + try { + // Try to get the deleted reservation + await reservationsClient.get({ + project: projectId, + zone, + reservation: reservationName, + }); + + // If the reservation is found, the test should fail + throw new Error('Reservation was not deleted.'); + } catch (error) { + // Assert that the error message indicates the reservation wasn't found + expect(error.message).to.include( + `The resource 'projects/${projectId}/zones/${zone}/reservations/${reservationName}' was not found` + ); + } + }); });