Skip to content

Commit

Permalink
feat: compute reservation create (GoogleCloudPlatform#3807)
Browse files Browse the repository at this point in the history
* Changed debian-10 -> debian-11

* feat: compute_reservation_create
  • Loading branch information
gryczj authored Sep 4, 2024
1 parent b01e844 commit 2a47751
Show file tree
Hide file tree
Showing 5 changed files with 203 additions and 3 deletions.
2 changes: 1 addition & 1 deletion compute/disks/createComputeHyperdiskFromPool.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion compute/disks/createComputeHyperdiskPool.js
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
117 changes: 117 additions & 0 deletions compute/reservations/createReservationFromProperties.js
Original file line number Diff line number Diff line change
@@ -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;
});
2 changes: 1 addition & 1 deletion compute/test/createComputeHyperdiskFromPool.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
83 changes: 83 additions & 0 deletions compute/test/createReservationFromProperties.test.js
Original file line number Diff line number Diff line change
@@ -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
);
});
});

0 comments on commit 2a47751

Please sign in to comment.