Skip to content

Commit

Permalink
feat: batch_labels_runnable (#3792)
Browse files Browse the repository at this point in the history
* feat: batch_labels_runnable

* refactor: add missing doc for projectId

* Add missing await

* Changes after review
  • Loading branch information
gryczj authored Aug 19, 2024
1 parent 9af3f5d commit 6fe7417
Show file tree
Hide file tree
Showing 11 changed files with 214 additions and 5 deletions.
3 changes: 2 additions & 1 deletion batch/create/create_batch_custom_events.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -105,7 +106,7 @@ async function main() {
console.log(JSON.stringify(response));
}

callCreateBatchCustomEvents();
await callCreateBatchCustomEvents();
// [END batch_custom_events]
}

Expand Down
3 changes: 2 additions & 1 deletion batch/create/create_batch_labels_allocation.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -113,7 +114,7 @@ async function main() {
console.log(JSON.stringify(response));
}

callCreateBatchLabelsAllocation();
await callCreateBatchLabelsAllocation();
// [END batch_labels_allocation]
}

Expand Down
3 changes: 2 additions & 1 deletion batch/create/create_batch_labels_job.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -103,7 +104,7 @@ async function main() {
console.log(JSON.stringify(response));
}

callCreateBatchLabelsJob();
await callCreateBatchLabelsJob();
// [END batch_labels_job]
}

Expand Down
129 changes: 129 additions & 0 deletions batch/create/create_batch_labels_runnable.js
Original file line number Diff line number Diff line change
@@ -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;
});
1 change: 1 addition & 0 deletions batch/create/create_batch_notifications.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions batch/create/create_gpu_job.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions batch/create/create_gpu_job_n1.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions batch/create/create_local_ssd_job.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion batch/create/create_nfs_job.js
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ async function main() {
console.log(JSON.stringify(response));
}

callCreateBatchNfsJob();
await callCreateBatchNfsJob();
// [END batch_create_nfs_job]
}

Expand Down
2 changes: 1 addition & 1 deletion batch/create/create_using_secret_manager.js
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ async function main() {
console.log(JSON.stringify(response));
}

callCreateUsingSecretManager();
await callCreateUsingSecretManager();
// [END batch_create_using_secret_manager]
}

Expand Down
73 changes: 73 additions & 0 deletions batch/test/create_batch_labels_runnable.test.js
Original file line number Diff line number Diff line change
@@ -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);
});
});
});

0 comments on commit 6fe7417

Please sign in to comment.