diff --git a/compute/disks/createComputeHyperdiskFromPool.js b/compute/disks/createComputeHyperdiskFromPool.js index 32c09214f4..3a2c34d09d 100644 --- a/compute/disks/createComputeHyperdiskFromPool.js +++ b/compute/disks/createComputeHyperdiskFromPool.js @@ -33,7 +33,7 @@ async function main() { // Project ID or project number of the Google Cloud project you want to use. const projectId = await disksClient.getProjectId(); // The zone where your VM and new disk are located. - const zone = 'europe-central2-b'; + const zone = 'us-central1-a'; // The name of the new disk const diskName = 'disk-from-pool-name'; // The name of the storage pool diff --git a/compute/disks/createComputeHyperdiskPool.js b/compute/disks/createComputeHyperdiskPool.js index d1ce4e6549..d8ae457e6b 100644 --- a/compute/disks/createComputeHyperdiskPool.js +++ b/compute/disks/createComputeHyperdiskPool.js @@ -33,7 +33,7 @@ async function main() { // Project ID or project number of the Google Cloud project you want to use. const projectId = await storagePoolClient.getProjectId(); // Name of the zone in which you want to create the storagePool. - const zone = 'europe-central2-b'; + const zone = 'us-central1-a'; // Name of the storagePool you want to create. const storagePoolName = 'storage-pool-name'; // The type of disk you want to create. This value uses the following format: diff --git a/compute/reservations/createReservationFromProperties.js b/compute/reservations/createReservationFromProperties.js new file mode 100644 index 0000000000..a21bdccee6 --- /dev/null +++ b/compute/reservations/createReservationFromProperties.js @@ -0,0 +1,117 @@ +/* + * 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_create] + // Import the Compute library + const computeLib = require('@google-cloud/compute'); + const compute = computeLib.protos.google.cloud.compute.v1; + + // 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 you want to reserve resources and where the instance template exists. + const projectId = await reservationsClient.getProjectId(); + // The zone in which to reserve resources. + const zone = 'us-central1-a'; + // The name of the reservation to create. + const reservationName = 'reservation-01'; + // The number of VMs to reserve. + const vmsNumber = 3; + // Machine type to use for each VM. + const machineType = 'n1-standard-4'; + + async function callCreateComputeReservationFromProperties() { + // Create specific reservation for 3 VMs that each use an N1 predefined machine type with 4 vCPUs. + const specificReservation = new compute.AllocationSpecificSKUReservation({ + count: vmsNumber, + instanceProperties: { + machineType, + // To have the reserved VMs use a specific minimum CPU platform instead of the zone's default CPU platform. + minCpuPlatform: 'Intel Skylake', + // If you want to attach GPUs to your reserved N1 VMs, update and uncomment guestAccelerators if needed. + guestAccelerators: [ + { + // The number of GPUs to add per reserved VM. + acceleratorCount: 1, + // Supported GPU model for N1 VMs. Ensure that your chosen GPU model is available in the zone, + // where you want to reserve resources. + acceleratorType: 'nvidia-tesla-t4', + }, + ], + // If you want to add local SSD disks to each reserved VM, update and uncomment localSsds if needed. + // You can specify up to 24 Local SSD disks. Each Local SSD disk is 375 GB. + localSsds: [ + { + diskSizeGb: 375, + // The type of interface you want each Local SSD disk to use. Specify one of the following values: NVME or SCSI. + // Make sure that the machine type you specify for the reserved VMs supports the chosen disk interfaces. + interface: 'NVME', + }, + ], + }, + }); + + // Create a reservation. + const reservation = new compute.Reservation({ + name: reservationName, + zone, + specificReservation, + }); + + const [response] = await reservationsClient.insert({ + project: projectId, + reservationResource: reservation, + zone, + }); + + let operation = response.latestResponse; + + // Wait for the create reservation operation to complete. + while (operation.status !== 'DONE') { + [operation] = await zoneOperationsClient.wait({ + operation: operation.name, + project: projectId, + zone: operation.zone.split('/').pop(), + }); + } + + const createdReservation = ( + await reservationsClient.get({ + project: projectId, + zone, + reservation: reservationName, + }) + )[0]; + + console.log(JSON.stringify(createdReservation)); + } + + await callCreateComputeReservationFromProperties(); + // [END compute_reservation_create] +} + +main().catch(err => { + console.error(err); + process.exitCode = 1; +}); diff --git a/compute/test/createComputeHyperdiskFromPool.test.js b/compute/test/createComputeHyperdiskFromPool.test.js index 1a7130cafe..5813a2158c 100644 --- a/compute/test/createComputeHyperdiskFromPool.test.js +++ b/compute/test/createComputeHyperdiskFromPool.test.js @@ -67,7 +67,7 @@ async function cleanupResources(projectId, zone, diskName, storagePoolName) { describe('Create compute hyperdisk from pool', async () => { const diskName = 'disk-from-pool-name'; - const zone = 'europe-central2-b'; + const zone = 'us-central1-a'; const storagePoolName = 'storage-pool-name'; const disksClient = new DisksClient(); let projectId; diff --git a/compute/test/createReservationFromProperties.test.js b/compute/test/createReservationFromProperties.test.js new file mode 100644 index 0000000000..9c7512bf7d --- /dev/null +++ b/compute/test/createReservationFromProperties.test.js @@ -0,0 +1,83 @@ +/* + * 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'; + +const path = require('path'); +const assert = require('node:assert/strict'); +const {after, before, describe, it} = require('mocha'); +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 () => { + const reservationName = 'reservation-01'; + const zone = 'us-central1-a'; + const reservationsClient = new ReservationsClient(); + let projectId; + + 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', + _minCpuPlatform: 'minCpuPlatform', + guestAccelerators: [ + { + _acceleratorCount: 'acceleratorCount', + _acceleratorType: 'acceleratorType', + acceleratorCount: 1, + acceleratorType: 'nvidia-tesla-t4', + }, + ], + localSsds: [ + { + diskSizeGb: '375', + interface: 'NVME', + _diskSizeGb: 'diskSizeGb', + _interface: 'interface', + }, + ], + machineType: 'n1-standard-4', + minCpuPlatform: 'Intel Skylake', + }; + + const response = JSON.parse( + execSync('node ./reservations/createReservationFromProperties.js', { + cwd, + }) + ); + + assert.equal(response.name, reservationName); + assert.equal(response.specificReservation.count, '3'); + assert.deepEqual( + response.specificReservation.instanceProperties, + instanceProperties + ); + }); +});