From 960fee3f6d2e22b564b3323433739954a65b182d Mon Sep 17 00:00:00 2001 From: Joanna Grycz <37943406+gryczj@users.noreply.github.com> Date: Thu, 5 Dec 2024 14:14:32 +0100 Subject: [PATCH] feat: compute_snapshot_schedule_create/delete/get/edit (#3925) * feat: compute_snapshot_schedule_create/delete * feat: compute_snapshot_schedule_get * feat: compute_snapshot_schedule_edit --- .../createSnapshotSchedule.js | 104 ++++++++++++ .../deleteSnapshotSchedule.js | 70 ++++++++ .../snapshotSchedule/editSnapshotSchedule.js | 85 ++++++++++ .../snapshotSchedule/getSnapshotSchedule.js | 56 +++++++ compute/test/snapshotSchedule.test.js | 149 ++++++++++++++++++ 5 files changed, 464 insertions(+) create mode 100644 compute/snapshotSchedule/createSnapshotSchedule.js create mode 100644 compute/snapshotSchedule/deleteSnapshotSchedule.js create mode 100644 compute/snapshotSchedule/editSnapshotSchedule.js create mode 100644 compute/snapshotSchedule/getSnapshotSchedule.js create mode 100644 compute/test/snapshotSchedule.test.js diff --git a/compute/snapshotSchedule/createSnapshotSchedule.js b/compute/snapshotSchedule/createSnapshotSchedule.js new file mode 100644 index 0000000000..a12174a586 --- /dev/null +++ b/compute/snapshotSchedule/createSnapshotSchedule.js @@ -0,0 +1,104 @@ +/* + * 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(snapshotScheduleName, region) { + // [START compute_snapshot_schedule_create] + // Import the Compute library + const computeLib = require('@google-cloud/compute'); + const compute = computeLib.protos.google.cloud.compute.v1; + + // Instantiate a resourcePoliciesClient + const resourcePoliciesClient = new computeLib.ResourcePoliciesClient(); + // Instantiate a regionOperationsClient + const regionOperationsClient = new computeLib.RegionOperationsClient(); + + /** + * TODO(developer): Update/uncomment these variables before running the sample. + */ + // The project name. + const projectId = await resourcePoliciesClient.getProjectId(); + + // The location of the snapshot schedule resource policy. + // region = 'us-central1'; + + // The name of the snapshot schedule. + // snapshotScheduleName = 'snapshot-schedule-name'; + + // The description of the snapshot schedule. + const snapshotScheduleDescription = 'snapshot schedule description...'; + + async function callCreateSnapshotSchedule() { + const [response] = await resourcePoliciesClient.insert({ + project: projectId, + region, + resourcePolicyResource: new compute.ResourcePolicy({ + name: snapshotScheduleName, + description: snapshotScheduleDescription, + snapshotSchedulePolicy: + new compute.ResourcePolicyInstanceSchedulePolicySchedule({ + retentionPolicy: + new compute.ResourcePolicySnapshotSchedulePolicyRetentionPolicy({ + maxRetentionDays: 5, + }), + schedule: new compute.ResourcePolicySnapshotSchedulePolicySchedule({ + // Similarly, you can create a weekly or monthly schedule. + // Review the resourcePolicies.insert method for details specific to setting a weekly or monthly schedule. + // To see more details, open: `https://cloud.google.com/compute/docs/disks/scheduled-snapshots?authuser=0#create_snapshot_schedule` + dailySchedule: new compute.ResourcePolicyDailyCycle({ + startTime: '12:00', + daysInCycle: 1, + }), + }), + snapshotProperties: + new compute.ResourcePolicySnapshotSchedulePolicySnapshotProperties( + { + guestFlush: false, + labels: { + env: 'dev', + media: 'images', + }, + // OPTIONAL: the storage location. If you omit this flag, the default storage location is used. + // storageLocations: 'storage-location', + } + ), + }), + }), + }); + + 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(`Snapshot schedule: ${snapshotScheduleName} created.`); + } + + await callCreateSnapshotSchedule(); + // [END compute_snapshot_schedule_create] +} + +main(...process.argv.slice(2)).catch(err => { + console.error(err); + process.exitCode = 1; +}); diff --git a/compute/snapshotSchedule/deleteSnapshotSchedule.js b/compute/snapshotSchedule/deleteSnapshotSchedule.js new file mode 100644 index 0000000000..aee5a13853 --- /dev/null +++ b/compute/snapshotSchedule/deleteSnapshotSchedule.js @@ -0,0 +1,70 @@ +/* + * 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(snapshotScheduleName, region) { + // [START compute_snapshot_schedule_delete] + // Import the Compute library + const computeLib = require('@google-cloud/compute'); + + // Instantiate a resourcePoliciesClient + const resourcePoliciesClient = new computeLib.ResourcePoliciesClient(); + // Instantiate a regionOperationsClient + const regionOperationsClient = new computeLib.RegionOperationsClient(); + + /** + * TODO(developer): Update/uncomment these variables before running the sample. + */ + // The project name. + const projectId = await resourcePoliciesClient.getProjectId(); + + // The location of the snapshot schedule resource policy. + // region = 'us-central1'; + + // The name of the snapshot schedule. + // snapshotScheduleName = 'snapshot-schedule-name' + + async function callDeleteSnapshotSchedule() { + // If the snapshot schedule is already attached to a disk, you will receive an error. + const [response] = await resourcePoliciesClient.delete({ + project: projectId, + region, + resourcePolicy: snapshotScheduleName, + }); + + 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(`Snapshot schedule: ${snapshotScheduleName} deleted.`); + } + + await callDeleteSnapshotSchedule(); + // [END compute_snapshot_schedule_delete] +} + +main(...process.argv.slice(2)).catch(err => { + console.error(err); + process.exitCode = 1; +}); diff --git a/compute/snapshotSchedule/editSnapshotSchedule.js b/compute/snapshotSchedule/editSnapshotSchedule.js new file mode 100644 index 0000000000..dfa8562171 --- /dev/null +++ b/compute/snapshotSchedule/editSnapshotSchedule.js @@ -0,0 +1,85 @@ +/* + * 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(snapshotScheduleName, region) { + // [START compute_snapshot_schedule_edit] + // Import the Compute library + const computeLib = require('@google-cloud/compute'); + const compute = computeLib.protos.google.cloud.compute.v1; + + // Instantiate a resourcePoliciesClient + const resourcePoliciesClient = new computeLib.ResourcePoliciesClient(); + // Instantiate a regionOperationsClient + const regionOperationsClient = new computeLib.RegionOperationsClient(); + + /** + * TODO(developer): Update/uncomment these variables before running the sample. + */ + // The project name. + const projectId = await resourcePoliciesClient.getProjectId(); + + // The location of the snapshot schedule resource policy. + // region = 'us-central1'; + + // The name of the snapshot schedule. + // snapshotScheduleName = 'snapshot-schedule-name'; + + async function callEditSnapshotSchedule() { + const [response] = await resourcePoliciesClient.patch({ + project: projectId, + region, + resourcePolicy: snapshotScheduleName, + resourcePolicyResource: compute.ResourcePolicy({ + snapshotSchedulePolicy: + compute.ResourcePolicyInstanceSchedulePolicySchedule({ + schedule: compute.ResourcePolicySnapshotSchedulePolicySchedule({ + weeklySchedule: compute.ResourcePolicyWeeklyCycle({ + dayOfWeeks: [ + compute.ResourcePolicyWeeklyCycleDayOfWeek({ + day: 'Tuesday', + startTime: '9:00', + }), + ], + }), + }), + }), + }), + }); + + let operation = response.latestResponse; + + // Wait for the edit operation to complete. + while (operation.status !== 'DONE') { + [operation] = await regionOperationsClient.wait({ + operation: operation.name, + project: projectId, + region, + }); + } + + console.log(`Snapshot schedule: ${snapshotScheduleName} edited.`); + } + + await callEditSnapshotSchedule(); + // [END compute_snapshot_schedule_edit] +} + +main(...process.argv.slice(2)).catch(err => { + console.error(err); + process.exitCode = 1; +}); diff --git a/compute/snapshotSchedule/getSnapshotSchedule.js b/compute/snapshotSchedule/getSnapshotSchedule.js new file mode 100644 index 0000000000..7107b5ebf6 --- /dev/null +++ b/compute/snapshotSchedule/getSnapshotSchedule.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'; + +async function main(snapshotScheduleName, region) { + // [START compute_snapshot_schedule_get] + // Import the Compute library + const computeLib = require('@google-cloud/compute'); + + // Instantiate a resourcePoliciesClient + const resourcePoliciesClient = new computeLib.ResourcePoliciesClient(); + + /** + * TODO(developer): Update/uncomment these variables before running the sample. + */ + // The project name. + const projectId = await resourcePoliciesClient.getProjectId(); + + // The location of the snapshot schedule resource policy. + // region = 'us-central1'; + + // The name of the snapshot schedule. + // snapshotScheduleName = 'snapshot-schedule-name'; + + async function callGetSnapshotSchedule() { + const [response] = await resourcePoliciesClient.get({ + project: projectId, + region, + resourcePolicy: snapshotScheduleName, + }); + + console.log(JSON.stringify(response)); + } + + await callGetSnapshotSchedule(); + // [END compute_snapshot_schedule_get] +} + +main(...process.argv.slice(2)).catch(err => { + console.error(err); + process.exitCode = 1; +}); diff --git a/compute/test/snapshotSchedule.test.js b/compute/test/snapshotSchedule.test.js new file mode 100644 index 0000000000..0d21ea17cf --- /dev/null +++ b/compute/test/snapshotSchedule.test.js @@ -0,0 +1,149 @@ +/* + * 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('node:assert/strict'); +const {describe, it} = require('mocha'); +const cp = require('child_process'); +const uuid = require('uuid'); + +const execSync = cmd => cp.execSync(cmd, {encoding: 'utf-8'}); +const cwd = path.join(__dirname, '..'); + +describe('Snapshot schedule', async () => { + const region = 'us-central1'; + + it('should create snapshot schedule', () => { + const snapshotScheduleName = `snapshot-schedule-name-${uuid.v4()}`; + + const response = execSync( + `node ./snapshotSchedule/createSnapshotSchedule.js ${snapshotScheduleName} ${region}`, + { + cwd, + } + ); + + assert( + response.includes(`Snapshot schedule: ${snapshotScheduleName} created.`) + ); + + // Delete resource + execSync( + `node ./snapshotSchedule/deleteSnapshotSchedule.js ${snapshotScheduleName} ${region}`, + { + cwd, + } + ); + }); + + it('should return snapshot schedule', () => { + const snapshotScheduleName = `snapshot-schedule-name-${uuid.v4()}`; + // Create snapshot + execSync( + `node ./snapshotSchedule/createSnapshotSchedule.js ${snapshotScheduleName} ${region}`, + { + cwd, + } + ); + + const response = execSync( + `node ./snapshotSchedule/getSnapshotSchedule.js ${snapshotScheduleName} ${region}`, + { + cwd, + } + ); + + assert(response.includes(snapshotScheduleName)); + + // Delete resource + execSync( + `node ./snapshotSchedule/deleteSnapshotSchedule.js ${snapshotScheduleName} ${region}`, + { + cwd, + } + ); + }); + + it('should edit snapshot schedule', () => { + const snapshotScheduleName = `snapshot-schedule-name-${uuid.v4()}`; + // Create snapshot + execSync( + `node ./snapshotSchedule/createSnapshotSchedule.js ${snapshotScheduleName} ${region}`, + { + cwd, + } + ); + const currentSchedule = JSON.parse( + execSync( + `node ./snapshotSchedule/getSnapshotSchedule.js ${snapshotScheduleName} ${region}`, + { + cwd, + } + ) + ).snapshotSchedulePolicy.schedule; + + // Edit snapshot schedule + execSync( + `node ./snapshotSchedule/editSnapshotSchedule.js ${snapshotScheduleName} ${region}`, + { + cwd, + } + ); + + const updatedSchedule = JSON.parse( + execSync( + `node ./snapshotSchedule/getSnapshotSchedule.js ${snapshotScheduleName} ${region}`, + { + cwd, + } + ) + ).snapshotSchedulePolicy.schedule; + + assert.notStrictEqual(currentSchedule, updatedSchedule); + + // Delete resource + execSync( + `node ./snapshotSchedule/deleteSnapshotSchedule.js ${snapshotScheduleName} ${region}`, + { + cwd, + } + ); + }); + + it('should delete snapshot schedule', () => { + const snapshotScheduleName = `snapshot-schedule-name-${uuid.v4()}`; + // Create snapshot + execSync( + `node ./snapshotSchedule/createSnapshotSchedule.js ${snapshotScheduleName} ${region}`, + { + cwd, + } + ); + + const response = execSync( + `node ./snapshotSchedule/deleteSnapshotSchedule.js ${snapshotScheduleName} ${region}`, + { + cwd, + } + ); + + assert( + response.includes(`Snapshot schedule: ${snapshotScheduleName} deleted.`) + ); + }); +});