-
Notifications
You must be signed in to change notification settings - Fork 2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
chore(samples): add moving instances between zones samples (#747)
- Loading branch information
1 parent
f05da49
commit 25d0660
Showing
11 changed files
with
1,017 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
// Copyright 2022 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 | ||
// | ||
// http://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. | ||
|
||
/** | ||
* Creates a new disk in a project in given zone. | ||
* | ||
* @param {string} projectId - Project ID or project number of the Cloud project you want to use. | ||
* @param {string} zone - Name of the zone to create the instance in. For example: "us-west3-b". | ||
* @param {string} diskName - Name of the disk you want to create. | ||
* @param {string} diskType - The type of disk you want to create. This value uses the following format: | ||
* "zones/{zone}/diskTypes/(pd-standard|pd-ssd|pd-balanced|pd-extreme)". | ||
* For example: "zones/us-west3-b/diskTypes/pd-ssd". | ||
* @param {int} diskSizeGb - Size of the new disk in gigabytes. | ||
* @param {string} snapshotLink - A link to the snapshot you want to use as a source for the new disk. | ||
* This value uses the following format: "projects/{project_name}/global/snapshots/{snapshot_name}" | ||
*/ | ||
|
||
function main(projectId, zone, diskName, diskType, diskSizeGb, snapshotLink) { | ||
// [START compute_disk_create_from_snapshot] | ||
/** | ||
* TODO(developer): Uncomment and replace these variables before running the sample. | ||
*/ | ||
// const projectId = 'YOUR_PROJECT_ID'; | ||
// const zone = 'europe-central2-b'; | ||
// const diskName = 'YOUR_DISK_NAME'; | ||
// const diskType = 'zones/us-west3-b/diskTypes/pd-ssd'; | ||
// const diskSizeGb = 10; | ||
// const snapshotLink = 'projects/project_name/global/snapshots/snapshot_name'; | ||
|
||
const compute = require('@google-cloud/compute'); | ||
|
||
async function createDiskFromSnapshot() { | ||
const disksClient = new compute.DisksClient(); | ||
|
||
const [response] = await disksClient.insert({ | ||
project: projectId, | ||
zone, | ||
diskResource: { | ||
sizeGb: diskSizeGb, | ||
name: diskName, | ||
zone, | ||
type: diskType, | ||
sourceSnapshot: snapshotLink, | ||
}, | ||
}); | ||
let operation = response.latestResponse; | ||
const operationsClient = new compute.ZoneOperationsClient(); | ||
|
||
// Wait for the create disk operation to complete. | ||
while (operation.status !== 'DONE') { | ||
[operation] = await operationsClient.wait({ | ||
operation: operation.name, | ||
project: projectId, | ||
zone: operation.zone.split('/').pop(), | ||
}); | ||
} | ||
|
||
console.log('Disk created.'); | ||
} | ||
|
||
createDiskFromSnapshot(); | ||
// [END compute_disk_create_from_snapshot] | ||
} | ||
|
||
process.on('unhandledRejection', err => { | ||
console.error(err.message); | ||
process.exitCode = 1; | ||
}); | ||
|
||
const args = process.argv.slice(2); | ||
args[4] = parseInt(args[4]); | ||
main(...args); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
// Copyright 2022 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 | ||
// | ||
// http://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. | ||
|
||
/** | ||
* Deletes a disk from a project. | ||
* | ||
* @param {string} projectId - Project ID or project number of the Cloud project you want to use. | ||
* @param {string} zone - Name of the zone in which is the disk you want to delete. | ||
* @param {string} diskName - Name of the disk you want to delete. | ||
*/ | ||
function main(projectId, zone, diskName) { | ||
// [START compute_disk_delete] | ||
/** | ||
* TODO(developer): Uncomment and replace these variables before running the sample. | ||
*/ | ||
// const projectId = 'YOUR_PROJECT_ID'; | ||
// const zone = 'europe-central2-b'; | ||
// const diskName = 'YOUR_DISK_NAME'; | ||
|
||
const compute = require('@google-cloud/compute'); | ||
|
||
async function deleteDisk() { | ||
const disksClient = new compute.DisksClient(); | ||
|
||
const [response] = await disksClient.delete({ | ||
project: projectId, | ||
zone, | ||
disk: diskName, | ||
}); | ||
let operation = response.latestResponse; | ||
const operationsClient = new compute.ZoneOperationsClient(); | ||
|
||
// Wait for the create disk operation to complete. | ||
while (operation.status !== 'DONE') { | ||
[operation] = await operationsClient.wait({ | ||
operation: operation.name, | ||
project: projectId, | ||
zone: operation.zone.split('/').pop(), | ||
}); | ||
} | ||
|
||
console.log('Disk deleted.'); | ||
} | ||
|
||
deleteDisk(); | ||
// [END compute_disk_delete] | ||
} | ||
|
||
process.on('unhandledRejection', err => { | ||
console.error(err.message); | ||
process.exitCode = 1; | ||
}); | ||
|
||
main(...process.argv.slice(2)); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
// Copyright 2022 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 | ||
// | ||
// http://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. | ||
|
||
/** | ||
* Sets the autodelete flag of a disk to given value. | ||
* | ||
* @param {string} projectId - Project ID or project number of the Cloud project you want to use. | ||
* @param {string} zone - Name of the zone in which is the disk you want to modify. | ||
* @param {string} instanceName - Name of the instance the disk is attached to. | ||
* @param {string} diskName - The name of the disk which flag you want to modify. | ||
* @param {boolean} autoDelete - The new value of the autodelete flag. | ||
*/ | ||
function main(projectId, zone, instanceName, diskName, autoDelete) { | ||
// [START compute_disk_autodelete_change] | ||
/** | ||
* TODO(developer): Uncomment and replace these variables before running the sample. | ||
*/ | ||
// const projectId = 'YOUR_PROJECT_ID'; | ||
// const zone = 'europe-central2-b'; | ||
// const instanceName = 'YOUR_INSTANCE_NAME'; | ||
// const diskName = 'YOUR_DISK_NAME'; | ||
// const autoDelete = true; | ||
|
||
const compute = require('@google-cloud/compute'); | ||
|
||
async function setDiskAutodelete() { | ||
const instancesClient = new compute.InstancesClient(); | ||
|
||
const [instance] = await instancesClient.get({ | ||
project: projectId, | ||
zone, | ||
instance: instanceName, | ||
}); | ||
|
||
if (!instance.disks.some(disk => disk.deviceName === diskName)) { | ||
throw new Error( | ||
`Instance ${instanceName} doesn't have a disk named ${diskName} attached.` | ||
); | ||
} | ||
|
||
const [response] = await instancesClient.setDiskAutoDelete({ | ||
project: projectId, | ||
zone, | ||
instance: instanceName, | ||
deviceName: diskName, | ||
autoDelete, | ||
}); | ||
let operation = response.latestResponse; | ||
const operationsClient = new compute.ZoneOperationsClient(); | ||
|
||
// Wait for the update instance operation to complete. | ||
while (operation.status !== 'DONE') { | ||
[operation] = await operationsClient.wait({ | ||
operation: operation.name, | ||
project: projectId, | ||
zone: operation.zone.split('/').pop(), | ||
}); | ||
} | ||
|
||
console.log('Disk autoDelete field updated.'); | ||
} | ||
|
||
setDiskAutodelete(); | ||
// [END compute_disk_autodelete_change] | ||
} | ||
|
||
process.on('unhandledRejection', err => { | ||
console.error(err.message); | ||
process.exitCode = 1; | ||
}); | ||
|
||
const args = process.argv.slice(2); | ||
args[4] = args[4] === 'true'; | ||
main(...args); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
// Copyright 2022 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 | ||
// | ||
// http://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. | ||
|
||
/** | ||
* Prints information about a VM instance in the given zone in the specified project. | ||
* | ||
* @param {string} projectId - Project ID or project number of the Cloud project you want to use. | ||
* @param {string} zone - Name of the zone you want to use. For example: 'us-west3-b'. | ||
* @param {string} instanceName - Name of the VM instance you want to query. | ||
*/ | ||
function main(projectId, zone, instanceName) { | ||
// [START compute_instances_get] | ||
/** | ||
* TODO(developer): Uncomment and replace these variables before running the sample. | ||
*/ | ||
// const projectId = 'YOUR_PROJECT_ID'; | ||
// const zone = 'europe-central2-b' | ||
// const instanceName = 'YOUR_INSTANCE_NAME' | ||
|
||
const compute = require('@google-cloud/compute'); | ||
|
||
async function getInstance() { | ||
const instancesClient = new compute.InstancesClient(); | ||
|
||
const [instance] = await instancesClient.get({ | ||
project: projectId, | ||
zone, | ||
instance: instanceName, | ||
}); | ||
|
||
console.log( | ||
`Instance ${instanceName} data:\n${JSON.stringify(instance, null, 4)}` | ||
); | ||
} | ||
getInstance(); | ||
// [END compute_instances_get] | ||
} | ||
|
||
process.on('unhandledRejection', err => { | ||
console.error(err.message); | ||
process.exitCode = 1; | ||
}); | ||
|
||
main(...process.argv.slice(2)); |
104 changes: 104 additions & 0 deletions
104
compute/instances/create-start-instance/createInstanceWithExistingDisks.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
// Copyright 2022 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 | ||
// | ||
// http://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. | ||
|
||
/** | ||
* Create a new VM instance using selected disks. The first disk in diskNames will be used as boot disk. | ||
* | ||
* @param {string} projectId - Project ID or project number of the Cloud project you want to use. | ||
* @param {string} zone - Name of the zone to create the instance in. For example: "us-west3-b" | ||
* @param {string} instanceName - Name of the new virtual machine (VM) instance. | ||
* @param {Array<string>} diskNames - Array of disk names to be attached to the new virtual machine. | ||
* First disk in this list will be used as the boot device. | ||
*/ | ||
function main(projectId, zone, instanceName, diskNames) { | ||
// [START compute_instances_create_with_existing_disks] | ||
/** | ||
* TODO(developer): Uncomment and replace these variables before running the sample. | ||
*/ | ||
// const projectId = 'YOUR_PROJECT_ID'; | ||
// const zone = 'europe-central2-b'; | ||
// const instanceName = 'YOUR_INSTANCE_NAME'; | ||
// const diskNames = ['boot_disk', 'disk1', 'disk2']; | ||
|
||
const compute = require('@google-cloud/compute'); | ||
|
||
async function createWithExistingDisks() { | ||
const instancesClient = new compute.InstancesClient(); | ||
const disksClient = new compute.DisksClient(); | ||
|
||
if (diskNames.length < 1) { | ||
throw new Error('At least one disk should be provided'); | ||
} | ||
|
||
const disks = []; | ||
for (const diskName of diskNames) { | ||
const [disk] = await disksClient.get({ | ||
project: projectId, | ||
zone, | ||
disk: diskName, | ||
}); | ||
disks.push(disk); | ||
} | ||
|
||
const attachedDisks = []; | ||
|
||
for (const disk of disks) { | ||
attachedDisks.push({ | ||
source: disk.selfLink, | ||
}); | ||
} | ||
|
||
attachedDisks[0].boot = true; | ||
|
||
const [response] = await instancesClient.insert({ | ||
project: projectId, | ||
zone, | ||
instanceResource: { | ||
name: instanceName, | ||
disks: attachedDisks, | ||
machineType: `zones/${zone}/machineTypes/n1-standard-1`, | ||
networkInterfaces: [ | ||
{ | ||
name: 'global/networks/default', | ||
}, | ||
], | ||
}, | ||
}); | ||
let operation = response.latestResponse; | ||
const operationsClient = new compute.ZoneOperationsClient(); | ||
|
||
// Wait for the create operation to complete. | ||
while (operation.status !== 'DONE') { | ||
[operation] = await operationsClient.wait({ | ||
operation: operation.name, | ||
project: projectId, | ||
zone: operation.zone.split('/').pop(), | ||
}); | ||
} | ||
|
||
console.log('Instance created.'); | ||
} | ||
|
||
createWithExistingDisks(); | ||
// [END compute_instances_create_with_existing_disks] | ||
} | ||
|
||
process.on('unhandledRejection', err => { | ||
console.error(err.message); | ||
process.exitCode = 1; | ||
}); | ||
|
||
const args = process.argv.slice(2); | ||
args[3] = args[3].split(','); | ||
main(...args); |
Oops, something went wrong.