From 1cf0c616dcbfe5a24ce98aaca1baf5d0174b083c Mon Sep 17 00:00:00 2001 From: Joanna Grycz <37943406+gryczj@users.noreply.github.com> Date: Thu, 22 Aug 2024 20:01:16 +0200 Subject: [PATCH] feat: create_compute_hyperdisk (#3795) * feat: create_compute_hyperdisk * refactor: remove chai module * Revert chai module * Downgrade chai module * Fix tests * Revert the changes * Changed debian-10 -> debian-11 --- compute/createInstance.js | 6 +- ...createInstanceFromTemplateWithOverrides.js | 6 +- .../createInstanceWithCustomHostname.js | 4 +- compute/disks/createComputeHyperdisk.js | 99 +++++++++++++++++++ .../createInstanceWithAdditionalDisk.js | 2 +- .../createInstanceWithSubnet.js | 2 +- .../createInstance.js | 2 +- compute/test/createComputeHyperdisk.test.js | 52 ++++++++++ compute/test/createInstanceTemplates.test.js | 2 +- compute/test/createStartInstance.test.js | 4 +- compute/test/samples.test.js | 4 +- compute/test/util.js | 14 +++ .../v2/autoLabelInstance/test/system.test.js | 2 +- 13 files changed, 182 insertions(+), 17 deletions(-) create mode 100644 compute/disks/createComputeHyperdisk.js create mode 100644 compute/test/createComputeHyperdisk.test.js diff --git a/compute/createInstance.js b/compute/createInstance.js index a2c4841eb3..62ac57d395 100644 --- a/compute/createInstance.js +++ b/compute/createInstance.js @@ -25,7 +25,7 @@ * https://cloud.google.com/sdk/gcloud/reference/compute/machine-types/list * @param {string} sourceImage - Path the the disk image you want to use for your boot * disk. This can be one of the public images - * (e.g. "projects/debian-cloud/global/images/family/debian-10") + * (e.g. "projects/debian-cloud/global/images/family/debian-11") * or a private image you have access to. * You can check the list of available public images using: * $ gcloud compute images list @@ -37,7 +37,7 @@ function main( zone, instanceName, machineType = 'n1-standard-1', - sourceImage = 'projects/debian-cloud/global/images/family/debian-10', + sourceImage = 'projects/debian-cloud/global/images/family/debian-11', networkName = 'global/networks/default' ) { // [START compute_instances_create] @@ -48,7 +48,7 @@ function main( // const zone = 'europe-central2-b' // const instanceName = 'YOUR_INSTANCE_NAME' // const machineType = 'n1-standard-1'; - // const sourceImage = 'projects/debian-cloud/global/images/family/debian-10'; + // const sourceImage = 'projects/debian-cloud/global/images/family/debian-11'; // const networkName = 'global/networks/default'; const compute = require('@google-cloud/compute'); diff --git a/compute/createInstanceFromTemplateWithOverrides.js b/compute/createInstanceFromTemplateWithOverrides.js index f4003c7717..04edb38a95 100644 --- a/compute/createInstanceFromTemplateWithOverrides.js +++ b/compute/createInstanceFromTemplateWithOverrides.js @@ -26,7 +26,7 @@ * https://cloud.google.com/sdk/gcloud/reference/compute/machine-types/list * @param {string} newDiskSourceImage - Path the the disk image you want to use for your new * disk. This can be one of the public images - * (like "projects/debian-cloud/global/images/family/debian-10") + * (like "projects/debian-cloud/global/images/family/debian-11") * or a private image you have access to. * For a list of available public images, see the documentation: * http://cloud.google.com/compute/docs/images @@ -37,7 +37,7 @@ function main( instanceName, instanceTemplateName, machineType = 'n1-standard-2', - newDiskSourceImage = 'projects/debian-cloud/global/images/family/debian-10' + newDiskSourceImage = 'projects/debian-cloud/global/images/family/debian-11' ) { // [START compute_instances_create_from_template_with_overrides] /** @@ -48,7 +48,7 @@ function main( // const instanceName = 'YOUR_INSTANCE_NAME'; // const instanceTemplateName = 'YOUR_INSTANCE_TEMPLATE_NAME'; // const machineType = 'n1-standard-1'; - // const newDiskSourceImage = 'projects/debian-cloud/global/images/family/debian-10'; + // const newDiskSourceImage = 'projects/debian-cloud/global/images/family/debian-11'; const compute = require('@google-cloud/compute'); diff --git a/compute/custom-hostname-instance/createInstanceWithCustomHostname.js b/compute/custom-hostname-instance/createInstanceWithCustomHostname.js index 35342660ba..511189d088 100644 --- a/compute/custom-hostname-instance/createInstanceWithCustomHostname.js +++ b/compute/custom-hostname-instance/createInstanceWithCustomHostname.js @@ -40,7 +40,7 @@ function main( instanceName, hostname, machineType = 'n1-standard-1', - sourceImage = 'projects/debian-cloud/global/images/family/debian-10', + sourceImage = 'projects/debian-cloud/global/images/family/debian-11', networkName = 'global/networks/default' ) { // [START compute_instances_create_custom_hostname] @@ -52,7 +52,7 @@ function main( // const instanceName = 'YOUR_INSTANCE_NAME' // const hostname = 'host.example.com' // const machineType = 'n1-standard-1'; - // const sourceImage = 'projects/debian-cloud/global/images/family/debian-10'; + // const sourceImage = 'projects/debian-cloud/global/images/family/debian-11'; // const networkName = 'global/networks/default'; const compute = require('@google-cloud/compute'); diff --git a/compute/disks/createComputeHyperdisk.js b/compute/disks/createComputeHyperdisk.js new file mode 100644 index 0000000000..76b231eded --- /dev/null +++ b/compute/disks/createComputeHyperdisk.js @@ -0,0 +1,99 @@ +/* + * 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_hyperdisk_create] + // Import the Compute library + const computeLib = require('@google-cloud/compute'); + const compute = computeLib.protos.google.cloud.compute.v1; + + // Instantiate a diskClient + const disksClient = new computeLib.DisksClient(); + // Instantiate a zoneOperationsClient + const zoneOperationsClient = new computeLib.ZoneOperationsClient(); + + /** + * TODO(developer): Update these variables before running the sample. + */ + // 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'; + // The name of the new disk + const diskName = 'disk-name'; + // The type of disk. This value uses the following format: + // "zones/{zone}/diskTypes/(hyperdisk-balanced|hyperdisk-extreme|hyperdisk-ml|hyperdisk-throughput)". + // For example: "zones/us-west3-b/diskTypes/hyperdisk-balanced" + const diskType = `zones/${zone}/diskTypes/hyperdisk-balanced`; + // Size of the new disk in gigabytes. + const diskSizeGb = 10; + // Optional: For Hyperdisk Balanced or Hyperdisk Extreme disks, + // this is the number of I/O operations per second (IOPS) that the disk can handle. + const provisionedIops = 3000; + // Optional: For Hyperdisk Balanced or Hyperdisk Throughput volumes, + // this is an integer that represents the throughput, + // measured in MiB per second, that the disk can handle. + const provisionedThroughput = 140; + + async function callCreateComputeHyperdisk() { + // Create a disk + const disk = new compute.Disk({ + sizeGb: diskSizeGb, + name: diskName, + zone, + type: diskType, + provisionedIops, + provisionedThroughput, + }); + + const [response] = await disksClient.insert({ + project: projectId, + zone, + diskResource: disk, + }); + + let operation = response.latestResponse; + + // Wait for the create disk operation to complete. + while (operation.status !== 'DONE') { + [operation] = await zoneOperationsClient.wait({ + operation: operation.name, + project: projectId, + zone: operation.zone.split('/').pop(), + }); + } + + const hyperdisk = ( + await disksClient.get({ + project: projectId, + zone, + disk: diskName, + }) + )[0]; + + console.log(JSON.stringify(hyperdisk)); + } + + await callCreateComputeHyperdisk(); + // [END compute_hyperdisk_create] +} + +main().catch(err => { + console.error(err); + process.exitCode = 1; +}); diff --git a/compute/instances/create-start-instance/createInstanceWithAdditionalDisk.js b/compute/instances/create-start-instance/createInstanceWithAdditionalDisk.js index abbc540421..25f8119801 100644 --- a/compute/instances/create-start-instance/createInstanceWithAdditionalDisk.js +++ b/compute/instances/create-start-instance/createInstanceWithAdditionalDisk.js @@ -38,7 +38,7 @@ function main(projectId, zone, instanceName) { // List of public operating system (OS) images: https://cloud.google.com/compute/docs/images/os-details. const [newestDebian] = await imagesClient.getFromFamily({ project: 'debian-cloud', - family: 'debian-10', + family: 'debian-11', }); const [response] = await instancesClient.insert({ diff --git a/compute/instances/create-start-instance/createInstanceWithSubnet.js b/compute/instances/create-start-instance/createInstanceWithSubnet.js index 2c16e86813..fa2164c14b 100644 --- a/compute/instances/create-start-instance/createInstanceWithSubnet.js +++ b/compute/instances/create-start-instance/createInstanceWithSubnet.js @@ -52,7 +52,7 @@ function main( // List of public operating system (OS) images: https://cloud.google.com/compute/docs/images/os-details. const [newestDebian] = await imagesClient.getFromFamily({ project: 'debian-cloud', - family: 'debian-10', + family: 'debian-11', }); const [response] = await instancesClient.insert({ diff --git a/compute/instances/preventing-accidental-vm-deletion/createInstance.js b/compute/instances/preventing-accidental-vm-deletion/createInstance.js index 3d293f0c39..1cc0dea9eb 100644 --- a/compute/instances/preventing-accidental-vm-deletion/createInstance.js +++ b/compute/instances/preventing-accidental-vm-deletion/createInstance.js @@ -51,7 +51,7 @@ function main(projectId, zone, instanceName, deleteProtection) { initializeParams: { diskSizeGb: '10', sourceImage: - 'projects/debian-cloud/global/images/family/debian-10', + 'projects/debian-cloud/global/images/family/debian-11', }, autoDelete: true, boot: true, diff --git a/compute/test/createComputeHyperdisk.test.js b/compute/test/createComputeHyperdisk.test.js new file mode 100644 index 0000000000..252ce9ccc0 --- /dev/null +++ b/compute/test/createComputeHyperdisk.test.js @@ -0,0 +1,52 @@ +/* + * 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('chai'); +const {describe, it} = require('mocha'); +const cp = require('child_process'); +const {DisksClient} = require('@google-cloud/compute').v1; +const {deleteDisk} = require('./util'); + +const execSync = cmd => cp.execSync(cmd, {encoding: 'utf-8'}); +const cwd = path.join(__dirname, '..'); + +describe('Create compute hyperdisk', async () => { + const diskName = 'disk-name'; + const zone = 'europe-central2-b'; + const disksClient = new DisksClient(); + let projectId; + + before(async () => { + projectId = await disksClient.getProjectId(); + }); + + after(async () => { + await deleteDisk(disksClient, projectId, zone, diskName); + }); + + it('should create a new hyperdisk', () => { + const response = JSON.parse( + execSync('node ./disks/createComputeHyperdisk.js', { + cwd, + }) + ); + + assert.equal(response.name, diskName); + }); +}); diff --git a/compute/test/createInstanceTemplates.test.js b/compute/test/createInstanceTemplates.test.js index 93c05c0352..ea5040b1a4 100644 --- a/compute/test/createInstanceTemplates.test.js +++ b/compute/test/createInstanceTemplates.test.js @@ -34,7 +34,7 @@ const createInstance = async (projectId, zone, instanceName) => { { initializeParams: { diskSizeGb: '250', - sourceImage: 'projects/debian-cloud/global/images/family/debian-10', + sourceImage: 'projects/debian-cloud/global/images/family/debian-11', }, autoDelete: true, boot: true, diff --git a/compute/test/createStartInstance.test.js b/compute/test/createStartInstance.test.js index 2abcaf620c..0922511cd0 100644 --- a/compute/test/createStartInstance.test.js +++ b/compute/test/createStartInstance.test.js @@ -132,7 +132,7 @@ describe('create start instance tests', () => { const [newestDebian] = await imagesClient.getFromFamily({ project: 'debian-cloud', - family: 'debian-10', + family: 'debian-11', }); await createDisk(projectId, zone, diskName, newestDebian.selfLink); @@ -163,7 +163,7 @@ describe('create start instance tests', () => { const [newestDebian] = await imagesClient.getFromFamily({ project: 'debian-cloud', - family: 'debian-10', + family: 'debian-11', }); let output; diff --git a/compute/test/samples.test.js b/compute/test/samples.test.js index f45caa6511..e86358db00 100644 --- a/compute/test/samples.test.js +++ b/compute/test/samples.test.js @@ -269,7 +269,7 @@ describe('samples', () => { initializeParams: { diskSizeGb: '10', sourceImage: - 'projects/debian-cloud/global/images/family/debian-10', + 'projects/debian-cloud/global/images/family/debian-11', }, autoDelete: true, boot: true, @@ -447,7 +447,7 @@ describe('samples', () => { initializeParams: { diskSizeGb: '10', sourceImage: - 'projects/debian-cloud/global/images/family/debian-10', + 'projects/debian-cloud/global/images/family/debian-11', }, autoDelete: true, boot: true, diff --git a/compute/test/util.js b/compute/test/util.js index d192788ac1..9eb3e87f87 100644 --- a/compute/test/util.js +++ b/compute/test/util.js @@ -82,8 +82,22 @@ async function deleteInstance(zone, instanceName) { } } +async function deleteDisk(disksClient, projectId, zone, diskName) { + try { + await disksClient.delete({ + project: projectId, + disk: diskName, + zone, + }); + } catch (err) { + console.error('Deleting disk failed: ', err); + throw new Error(err); + } +} + module.exports = { generateTestId, getStaleVMInstances, deleteInstance, + deleteDisk, }; diff --git a/functions/v2/autoLabelInstance/test/system.test.js b/functions/v2/autoLabelInstance/test/system.test.js index cd2be3acb6..2f5c2c670c 100644 --- a/functions/v2/autoLabelInstance/test/system.test.js +++ b/functions/v2/autoLabelInstance/test/system.test.js @@ -47,7 +47,7 @@ describe('functions_label_gce_instance', () => { initializeParams: { diskSizeGb: '10', sourceImage: - 'projects/debian-cloud/global/images/family/debian-10', + 'projects/debian-cloud/global/images/family/debian-11', }, boot: true, autoDelete: true,