diff --git a/batch/create/create_batch_custom_events.js b/batch/create/create_batch_custom_events.js index 7b955979e4..7d07c8ceaa 100644 --- a/batch/create/create_batch_custom_events.js +++ b/batch/create/create_batch_custom_events.js @@ -28,6 +28,7 @@ async function main() { /** * 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 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 @@ -105,7 +106,7 @@ async function main() { console.log(JSON.stringify(response)); } - callCreateBatchCustomEvents(); + await callCreateBatchCustomEvents(); // [END batch_custom_events] } diff --git a/batch/create/create_batch_labels_allocation.js b/batch/create/create_batch_labels_allocation.js index bd0c39b51f..1cc688e80f 100644 --- a/batch/create/create_batch_labels_allocation.js +++ b/batch/create/create_batch_labels_allocation.js @@ -28,6 +28,7 @@ async function main() { /** * 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 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 @@ -113,7 +114,7 @@ async function main() { console.log(JSON.stringify(response)); } - callCreateBatchLabelsAllocation(); + await callCreateBatchLabelsAllocation(); // [END batch_labels_allocation] } diff --git a/batch/create/create_batch_labels_job.js b/batch/create/create_batch_labels_job.js index 8a90a94c0d..564d5c78b4 100644 --- a/batch/create/create_batch_labels_job.js +++ b/batch/create/create_batch_labels_job.js @@ -28,6 +28,7 @@ async function main() { /** * 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 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 @@ -103,7 +104,7 @@ async function main() { console.log(JSON.stringify(response)); } - callCreateBatchLabelsJob(); + await callCreateBatchLabelsJob(); // [END batch_labels_job] } diff --git a/batch/create/create_batch_labels_runnable.js b/batch/create/create_batch_labels_runnable.js new file mode 100644 index 0000000000..4a9f7c4333 --- /dev/null +++ b/batch/create/create_batch_labels_runnable.js @@ -0,0 +1,129 @@ +/* + * 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_runnable] + // 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. + */ + // Project ID or project number of the Google Cloud project you want to use. + 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 = 'us-central1'; + // The name of the job that will be created. + // It needs to be unique for each project and region pair. + const jobName = 'example-job'; + // Name of the label1 to be applied for your Job. + const labelName1 = 'RUNNABLE_LABEL_NAME1'; + // Value for the label1 to be applied for your Job. + const labelValue1 = 'RUNNABLE_LABEL_VALUE1'; + // Name of the label2 to be applied for your Job. + const labelName2 = 'RUNNABLE_LABEL_NAME2'; + // Value for the label2 to be applied for your Job. + const labelValue2 = 'RUNNABLE_LABEL_VALUE2'; + + const 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}.'], + }); + + const script = new batch.Runnable.Script({ + commands: ['-c', 'echo Hello world! This is task ${BATCH_TASK_INDEX}.'], + }); + + const runnable1 = new batch.Runnable({ + container, + // Label and its value to be applied to the container + // that processes data from a specific region. + labels: { + [labelName1]: labelValue1, + }, + }); + + const runnable2 = new batch.Runnable({ + script, + // Label and its value to be applied to the script + // that performs some analysis on the processed data. + labels: { + [labelName2]: labelValue2, + }, + }); + + // 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: [runnable1, runnable2], + 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, + }), + }); + + // The job's parent is the project and region in which the job will run + const parent = `projects/${projectId}/locations/${region}`; + + async function callCreateBatchLabelsRunnable() { + // Construct request + const request = { + parent, + jobId: jobName, + job, + }; + + // Run request + const [response] = await batchClient.createJob(request); + console.log(JSON.stringify(response)); + } + + await callCreateBatchLabelsRunnable(); + // [END batch_labels_runnable] +} + +main().catch(err => { + console.error(err.message); + process.exitCode = 1; +}); diff --git a/batch/create/create_batch_notifications.js b/batch/create/create_batch_notifications.js index f792470857..00f3e4b20b 100644 --- a/batch/create/create_batch_notifications.js +++ b/batch/create/create_batch_notifications.js @@ -28,6 +28,7 @@ async function main() { /** * TODO(developer): Update these variables before running the sample. */ + // Project ID or project number of the Google Cloud project you want to use. const PROJECT_ID = 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 diff --git a/batch/create/create_gpu_job.js b/batch/create/create_gpu_job.js index 1fb83b5e34..588104b1b4 100644 --- a/batch/create/create_gpu_job.js +++ b/batch/create/create_gpu_job.js @@ -28,6 +28,7 @@ async function main() { /** * 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 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 diff --git a/batch/create/create_gpu_job_n1.js b/batch/create/create_gpu_job_n1.js index b4579ebd9f..34bc6e3c1a 100644 --- a/batch/create/create_gpu_job_n1.js +++ b/batch/create/create_gpu_job_n1.js @@ -28,6 +28,7 @@ async function main() { /** * 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 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 diff --git a/batch/create/create_local_ssd_job.js b/batch/create/create_local_ssd_job.js index c051cd9a4a..34869f4378 100644 --- a/batch/create/create_local_ssd_job.js +++ b/batch/create/create_local_ssd_job.js @@ -28,6 +28,7 @@ async function main() { /** * 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 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 diff --git a/batch/create/create_nfs_job.js b/batch/create/create_nfs_job.js index 80650f72bb..cf338bb1aa 100644 --- a/batch/create/create_nfs_job.js +++ b/batch/create/create_nfs_job.js @@ -123,7 +123,7 @@ async function main() { console.log(JSON.stringify(response)); } - callCreateBatchNfsJob(); + await callCreateBatchNfsJob(); // [END batch_create_nfs_job] } diff --git a/batch/create/create_using_secret_manager.js b/batch/create/create_using_secret_manager.js index 7fc5553546..b755e6b98a 100644 --- a/batch/create/create_using_secret_manager.js +++ b/batch/create/create_using_secret_manager.js @@ -99,7 +99,7 @@ async function main() { console.log(JSON.stringify(response)); } - callCreateUsingSecretManager(); + await callCreateUsingSecretManager(); // [END batch_create_using_secret_manager] } diff --git a/batch/test/create_batch_labels_runnable.test.js b/batch/test/create_batch_labels_runnable.test.js new file mode 100644 index 0000000000..aeffd9a3a7 --- /dev/null +++ b/batch/test/create_batch_labels_runnable.test.js @@ -0,0 +1,73 @@ +/* + * 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 runnable', async () => { + const jobName = 'example-job'; + const region = 'us-central1'; + let projectId; + + before(async () => { + projectId = await batchClient.getProjectId(); + }); + + after(async () => { + await deleteJob(batchClient, projectId, region, jobName); + }); + + it('should create a new job with labels for runnables', async () => { + const expectedRunnableLabels = [ + { + executable: 'container', + labels: { + RUNNABLE_LABEL_NAME1: 'RUNNABLE_LABEL_VALUE1', + }, + }, + { + executable: 'script', + labels: { + RUNNABLE_LABEL_NAME2: 'RUNNABLE_LABEL_VALUE2', + }, + }, + ]; + + const response = JSON.parse( + execSync('node ./create/create_batch_labels_runnable.js', { + cwd, + }) + ); + const runnables = response.taskGroups[0].taskSpec.runnables; + + runnables.forEach((runnable, index) => { + assert.equal( + runnable.executable, + expectedRunnableLabels[index].executable + ); + assert.deepEqual(runnable.labels, expectedRunnableLabels[index].labels); + }); + }); +});