From 056862af30781fbb59e65e74b8f48c1a8e1e1aa3 Mon Sep 17 00:00:00 2001 From: Joanna Grycz Date: Fri, 6 Sep 2024 14:19:59 +0200 Subject: [PATCH] feat: add compute_regional_template_create/get/delete --- .../createRegionalTemplate.js | 101 ++++++++++++++++++ .../deleteRegionalTemplate.js | 68 ++++++++++++ .../getRegionalTemplate.js | 57 ++++++++++ compute/test/regionalTemplate.test.js | 89 +++++++++++++++ 4 files changed, 315 insertions(+) create mode 100644 compute/create-instance-templates/createRegionalTemplate.js create mode 100644 compute/create-instance-templates/deleteRegionalTemplate.js create mode 100644 compute/create-instance-templates/getRegionalTemplate.js create mode 100644 compute/test/regionalTemplate.test.js diff --git a/compute/create-instance-templates/createRegionalTemplate.js b/compute/create-instance-templates/createRegionalTemplate.js new file mode 100644 index 0000000000..068ca4c9d4 --- /dev/null +++ b/compute/create-instance-templates/createRegionalTemplate.js @@ -0,0 +1,101 @@ +/* + * 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(templateName) { + // [START compute_regional_template_create] + // Import the Compute library + const computeLib = require('@google-cloud/compute'); + const compute = computeLib.protos.google.cloud.compute.v1; + + // Instantiate a regionInstanceTemplatesClient + const regionInstanceTemplatesClient = + new computeLib.RegionInstanceTemplatesClient(); + // Instantiate a regionOperationsClient + const regionOperationsClient = new computeLib.RegionOperationsClient(); + + /** + * TODO(developer): Update/uncomment these variables before running the sample. + */ + // The ID of the project that you want to use. + const projectId = await regionInstanceTemplatesClient.getProjectId(); + // The region in which to create a template. + const region = 'us-central1'; + // The name of the new template to create. + // const templateName = 'regional-template-name'; + + // Create a new instance template with the provided name and a specific instance configuration. + async function createRegionalTemplate() { + // Define the boot disk for the instance template + const disk = new compute.AttachedDisk({ + initializeParams: new compute.AttachedDiskInitializeParams({ + sourceImage: + 'projects/debian-cloud/global/images/debian-12-bookworm-v20240815', + diskSizeGb: '100', + diskType: 'pd-balanced', + }), + autoDelete: true, + boot: true, + type: 'PERSISTENT', + }); + + // Define the network interface for the instance template + const network = new compute.NetworkInterface({ + network: `projects/${projectId}/global/networks/default`, + }); + + // Define instance template + const instanceTemplate = new compute.InstanceTemplate({ + name: templateName, + properties: { + disks: [disk], + region, + machineType: 'e2-medium', + // The template connects the instance to the `default` network, + // without specifying a subnetwork. + networkInterfaces: [network], + }, + }); + + const [response] = await regionInstanceTemplatesClient.insert({ + project: projectId, + region, + instanceTemplateResource: instanceTemplate, + }); + + let operation = response.latestResponse; + + // Wait for the create operation to complete. + while (operation.status !== 'DONE') { + [operation] = await regionOperationsClient.wait({ + operation: operation.name, + project: projectId, + region, + }); + } + + console.log(`Template: ${templateName} created.`); + } + + createRegionalTemplate(); + // [END compute_regional_template_create] +} + +main(...process.argv.slice(2)).catch(err => { + console.error(err); + process.exitCode = 1; +}); diff --git a/compute/create-instance-templates/deleteRegionalTemplate.js b/compute/create-instance-templates/deleteRegionalTemplate.js new file mode 100644 index 0000000000..560d0bf64c --- /dev/null +++ b/compute/create-instance-templates/deleteRegionalTemplate.js @@ -0,0 +1,68 @@ +/* + * 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(templateName) { + // [START compute_regional_template_delete] + // Import the Compute library + const computeLib = require('@google-cloud/compute'); + + // Instantiate a regionInstanceTemplatesClient + const regionInstanceTemplatesClient = + new computeLib.RegionInstanceTemplatesClient(); + // Instantiate a regionOperationsClient + const regionOperationsClient = new computeLib.RegionOperationsClient(); + + /** + * TODO(developer): Update/uncomment these variables before running the sample. + */ + // The ID of the project that you want to use. + const projectId = await regionInstanceTemplatesClient.getProjectId(); + // The region where template is created. + const region = 'us-central1'; + // The name of the template to delete. + // const templateName = 'regional-template-name'; + + async function deleteRegionalTemplate() { + const [response] = await regionInstanceTemplatesClient.delete({ + project: projectId, + instanceTemplate: templateName, + region, + }); + + let operation = response.latestResponse; + + // Wait for the delete operation to complete. + while (operation.status !== 'DONE') { + [operation] = await regionOperationsClient.wait({ + operation: operation.name, + project: projectId, + region, + }); + } + + console.log(`Template: ${templateName} deleted.`); + } + + deleteRegionalTemplate(); + // [END compute_regional_template_delete] +} + +main(...process.argv.slice(2)).catch(err => { + console.error(err); + process.exitCode = 1; +}); diff --git a/compute/create-instance-templates/getRegionalTemplate.js b/compute/create-instance-templates/getRegionalTemplate.js new file mode 100644 index 0000000000..613ed54807 --- /dev/null +++ b/compute/create-instance-templates/getRegionalTemplate.js @@ -0,0 +1,57 @@ +/* + * 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(templateName) { + // [START compute_regional_template_get] + // Import the Compute library + const computeLib = require('@google-cloud/compute'); + + // Instantiate a regionInstanceTemplatesClient + const regionInstanceTemplatesClient = + new computeLib.RegionInstanceTemplatesClient(); + + /** + * TODO(developer): Update/uncomment these variables before running the sample. + */ + // The ID of the project that you want to use. + const projectId = await regionInstanceTemplatesClient.getProjectId(); + // The region where template is created. + const region = 'us-central1'; + // The name of the template to return. + // const templateName = 'regional-template-name'; + + async function getRegionalTemplate() { + const template = ( + await regionInstanceTemplatesClient.get({ + project: projectId, + region, + instanceTemplate: templateName, + }) + )[0]; + + console.log(JSON.stringify(template)); + } + + getRegionalTemplate(); + // [END compute_regional_template_get] +} + +main(...process.argv.slice(2)).catch(err => { + console.error(err); + process.exitCode = 1; +}); diff --git a/compute/test/regionalTemplate.test.js b/compute/test/regionalTemplate.test.js new file mode 100644 index 0000000000..1d928776cd --- /dev/null +++ b/compute/test/regionalTemplate.test.js @@ -0,0 +1,89 @@ +/* + * 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, expect} = require('chai'); +const {before, describe, it} = require('mocha'); +const cp = require('child_process'); +const {RegionInstanceTemplatesClient} = require('@google-cloud/compute').v1; + +const execSync = cmd => cp.execSync(cmd, {encoding: 'utf-8'}); +const cwd = path.join(__dirname, '..'); + +describe('Regional instance template', async () => { + const templateName = `regional-template-name-745d98${Math.floor(Math.random() * 10 + 1)}f`; + const region = 'us-central1'; + const regionInstanceTemplatesClient = new RegionInstanceTemplatesClient(); + let projectId; + + before(async () => { + projectId = await regionInstanceTemplatesClient.getProjectId(); + }); + + it('should create a new template', () => { + const response = execSync( + `node ./create-instance-templates/createRegionalTemplate.js ${templateName}`, + { + cwd, + } + ); + + expect(response).includes(`Template: ${templateName} created.`); + }); + + it('should return template', () => { + const response = JSON.parse( + execSync( + `node ./create-instance-templates/getRegionalTemplate.js ${templateName}`, + { + cwd, + } + ) + ); + + assert.equal(response.name, templateName); + }); + + it('should delete template', async () => { + const response = execSync( + `node ./create-instance-templates/deleteRegionalTemplate.js ${templateName}`, + { + cwd, + } + ); + + expect(response).includes(`Template: ${templateName} deleted.`); + + try { + // Try to get the deleted template + await regionInstanceTemplatesClient.get({ + project: projectId, + region, + instanceTemplate: templateName, + }); + + // If the template is found, the test should fail + throw new Error('Template was not deleted.'); + } catch (error) { + // Assert that the error message indicates the template wasn't found + expect(error.message).to.include( + `The resource 'projects/${projectId}/regions/${region}/instanceTemplates/${templateName}' was not found` + ); + } + }); +});