From e3f92a31aa47fb1342f695641dce111172909c8b Mon Sep 17 00:00:00 2001 From: Joanna Grycz Date: Mon, 12 Aug 2024 17:46:13 +0200 Subject: [PATCH 1/2] feat: batch_labels_job --- batch/create/create_batch_labels_job.js | 113 +++++++++++++++++++++ batch/test/create_batch_labels_job.test.js | 56 ++++++++++ 2 files changed, 169 insertions(+) create mode 100644 batch/create/create_batch_labels_job.js create mode 100644 batch/test/create_batch_labels_job.test.js diff --git a/batch/create/create_batch_labels_job.js b/batch/create/create_batch_labels_job.js new file mode 100644 index 0000000000..64917a65dd --- /dev/null +++ b/batch/create/create_batch_labels_job.js @@ -0,0 +1,113 @@ +/* + * 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 batch_labels_job] + // Imports the Batch library + const batchLib = require('@google-cloud/batch'); + const batch = batchLib.protos.google.cloud.batch.v1; + + // Instantiates a client + const batchClient = new batchLib.v1.BatchServiceClient(); + + /** + * TODO(developer): Update these variables before running the sample. + */ + const projectId = await batchClient.getProjectId(); + // Name of the region you want to use to run the job. Regions that are + // available for Batch are listed on: https://cloud.google.com/batch/docs/get-started#locations + const region = 'europe-central2'; + // The name of the job that will be created. + // It needs to be unique for each project and region pair. + const jobName = 'batch-labels-job'; + // Name of the label1 to be applied for your Job. + const labelName1 = 'job_label_name_1'; + // Value for the label1 to be applied for your Job. + const labelValue1 = 'job_label_value1'; + // Name of the label2 to be applied for your Job. + const labelName2 = 'job_label_name_2'; + // Value for the label2 to be applied for your Job. + const labelValue2 = 'job_label_value2'; + + // Define what will be done as part of the job. + const runnable = new batch.Runnable({ + script: new batch.Runnable.Container({ + imageUri: 'gcr.io/google-containers/busybox', + entrypoint: '/bin/sh', + commands: ['-c', 'echo Hello world! This is task ${BATCH_TASK_INDEX}.'], + }), + }); + + // Specify what resources are requested by each task. + const computeResource = new batch.ComputeResource({ + // In milliseconds per cpu-second. This means the task requires 50% of a single CPUs. + cpuMilli: 500, + // In MiB. + memoryMib: 16, + }); + + const task = new batch.TaskSpec({ + runnables: [runnable], + computeResource, + maxRetryCount: 2, + maxRunDuration: {seconds: 3600}, + }); + + // Tasks are grouped inside a job using TaskGroups. + const group = new batch.TaskGroup({ + taskCount: 3, + taskSpec: task, + }); + + const job = new batch.Job({ + name: jobName, + taskGroups: [group], + // We use Cloud Logging as it's an option available out of the box + logsPolicy: new batch.LogsPolicy({ + destination: batch.LogsPolicy.Destination.CLOUD_LOGGING, + }), + }); + + // Labels and their value to be applied to the job and its resources. + job.labels[labelName1] = labelValue1; + job.labels[labelName2] = labelValue2; + + // The job's parent is the project and region in which the job will run + const parent = `projects/${projectId}/locations/${region}`; + + async function callCreateBatchLabelsJob() { + // Construct request + const request = { + parent, + jobId: jobName, + job, + }; + + // Run request + const [response] = await batchClient.createJob(request); + console.log(JSON.stringify(response)); + } + + callCreateBatchLabelsJob(); + // [END batch_labels_job] +} + +main().catch(err => { + console.error(err.message); + process.exitCode = 1; +}); diff --git a/batch/test/create_batch_labels_job.test.js b/batch/test/create_batch_labels_job.test.js new file mode 100644 index 0000000000..1777973ec1 --- /dev/null +++ b/batch/test/create_batch_labels_job.test.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'; + +const path = require('path'); +const assert = require('assert'); +const {describe, it} = require('mocha'); +const cp = require('child_process'); +const execSync = cmd => cp.execSync(cmd, {encoding: 'utf-8'}); +const cwd = path.join(__dirname, '..'); +const {BatchServiceClient} = require('@google-cloud/batch').v1; +const {deleteJob} = require('./batchClient_operations'); +const batchClient = new BatchServiceClient(); + +describe('Create batch labels for job', async () => { + const jobName = 'batch-labels-job'; + const region = 'europe-central2'; + let projectId; + + before(async () => { + projectId = await batchClient.getProjectId(); + }); + + after(async () => { + await deleteJob(batchClient, projectId, region, jobName); + }); + + it('should create a new job with labels', async () => { + const expectedJobLabels = { + job_label_name_1: 'job_label_value1', + job_label_name_2: 'job_label_value2', + }; + + const response = JSON.parse( + execSync('node ./create/create_batch_labels_job.js', { + cwd, + }) + ); + + assert.deepEqual(response.labels, expectedJobLabels); + }); +}); From 75baf79c9cd29726680444a33b6efd123272f908 Mon Sep 17 00:00:00 2001 From: Joanna Grycz Date: Mon, 12 Aug 2024 17:46:43 +0200 Subject: [PATCH 2/2] refactor: refactor code in labels allocation sample --- batch/create/create_batch_labels_allocation.js | 4 +--- batch/create/create_batch_labels_job.js | 2 +- batch/test/create_batch_labels_allocation.test.js | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/batch/create/create_batch_labels_allocation.js b/batch/create/create_batch_labels_allocation.js index efeaf65ccf..bd0c39b51f 100644 --- a/batch/create/create_batch_labels_allocation.js +++ b/batch/create/create_batch_labels_allocation.js @@ -117,9 +117,7 @@ async function main() { // [END batch_labels_allocation] } -process.on('unhandledRejection', err => { +main().catch(err => { console.error(err.message); process.exitCode = 1; }); - -main(); diff --git a/batch/create/create_batch_labels_job.js b/batch/create/create_batch_labels_job.js index 64917a65dd..8a90a94c0d 100644 --- a/batch/create/create_batch_labels_job.js +++ b/batch/create/create_batch_labels_job.js @@ -46,7 +46,7 @@ async function main() { // Define what will be done as part of the job. const runnable = new batch.Runnable({ - script: new batch.Runnable.Container({ + container: new batch.Runnable.Container({ imageUri: 'gcr.io/google-containers/busybox', entrypoint: '/bin/sh', commands: ['-c', 'echo Hello world! This is task ${BATCH_TASK_INDEX}.'], diff --git a/batch/test/create_batch_labels_allocation.test.js b/batch/test/create_batch_labels_allocation.test.js index 304e7e73ef..262f647549 100644 --- a/batch/test/create_batch_labels_allocation.test.js +++ b/batch/test/create_batch_labels_allocation.test.js @@ -41,7 +41,7 @@ describe('Create batch labels allocation', async () => { it('should create a new job with allocation policy labels', async () => { const expectedAllocationLabels = { - 'batch-job-id': 'batch-labels-allocation-job', + 'batch-job-id': jobName, vm_label_name_1: 'vmLabelValue1', vm_label_name_2: 'vmLabelValue2', };