Skip to content

Commit

Permalink
chore(samples): add periodical instances deletion (#680)
Browse files Browse the repository at this point in the history
  • Loading branch information
FrodoTheTrue authored and Ace Nassri committed Nov 21, 2022
1 parent b781d4d commit 5eb4758
Show file tree
Hide file tree
Showing 3 changed files with 113 additions and 2 deletions.
13 changes: 12 additions & 1 deletion compute/test/createStartInstance.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ const uuid = require('uuid');
const cp = require('child_process');
const {assert} = require('chai');

const {generateTestId, getStaleVMInstances, deleteInstance} = require('./util');

const instancesClient = new compute.InstancesClient();
const imagesClient = new compute.ImagesClient();
const snapshotsClient = new compute.SnapshotsClient();
Expand Down Expand Up @@ -109,13 +111,22 @@ const deleteDiskSnapshot = async (projectId, snapshotName) => {
};

describe('create start instance tests', () => {
const instanceName = `gcloud-test-instance-${uuid.v4().split('-')[0]}`;
const instanceName = generateTestId();
const networkName = 'global/networks/default-compute';
const subnetworkName = 'regions/europe-central2/subnetworks/default-compute';
const diskName = `gcloud-test-disk-${uuid.v4().split('-')[0]}`;
const snapshotName = `gcloud-test-snapshot-${uuid.v4().split('-')[0]}`;
const zone = 'europe-central2-b';

after(async () => {
const instances = await getStaleVMInstances();
await Promise.all(
instances.map(instance =>
deleteInstance(instance.zone, instance.instanceName)
)
);
});

it('should create instance from public image', async () => {
const projectId = await instancesClient.getProjectId();

Expand Down
13 changes: 12 additions & 1 deletion compute/test/samples.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ const uuid = require('uuid');
const cp = require('child_process');
const {assert} = require('chai');

const {generateTestId, getStaleVMInstances, deleteInstance} = require('./util');

const instancesClient = new compute.InstancesClient();
const projectsClient = new compute.ProjectsClient();
const firewallsClient = new compute.FirewallsClient();
Expand Down Expand Up @@ -54,12 +56,21 @@ const getInstance = async (projectId, zone, instanceName) => {
};

describe('samples', () => {
const instanceName = `gcloud-test-intance-${uuid.v4().split('-')[0]}`;
const instanceName = generateTestId();
const zone = 'europe-central2-b';
const bucketName = `test-bucket-name-${uuid.v4().split('-')[0]}`;

const storage = new Storage();

after(async () => {
const instances = await getStaleVMInstances();
await Promise.all(
instances.map(instance =>
deleteInstance(instance.zone, instance.instanceName)
)
);
});

it('should create instance', async () => {
const projectId = await instancesClient.getProjectId();
const output = execSync(
Expand Down
89 changes: 89 additions & 0 deletions compute/test/util.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
// 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.

const uuid = require('uuid');
const compute = require('@google-cloud/compute');

const PREFIX = 'gcloud-test-';

const instancesClient = new compute.InstancesClient();

// Get a unique ID to use for test resources.
function generateTestId() {
return `${PREFIX}-${uuid.v4()}`.substr(0, 30);
}

/**
* Get VM instances created more than one hour ago.
*/
async function getStaleVMInstances() {
const projectId = await instancesClient.getProjectId();
const result = [];
const currentDate = new Date();
currentDate.setHours(currentDate.getHours() - 3);

const aggListRequest = instancesClient.aggregatedListAsync({
project: projectId,
});

for await (const [zone, instancesObject] of aggListRequest) {
const instances = instancesObject.instances;
result.push(
...instances
.filter(
instance =>
new Date(instance.creationTimestamp) < currentDate &&
instance.name.startsWith(PREFIX)
)
.map(instance => {
return {
zone: zone.split('zones/')[1],
instanceName: instance.name,
timestamp: instance.creationTimestamp,
};
})
);
}

return result;
}

async function deleteInstance(zone, instanceName) {
const projectId = await instancesClient.getProjectId();

const [response] = await instancesClient.delete({
project: projectId,
instance: instanceName,
zone,
});
let operation = response.latestResponse;
const operationsClient = new compute.ZoneOperationsClient();

console.log(`Deleting ${instanceName}`);

// Wait for the create operation to complete.
while (operation.status !== 'DONE') {
[operation] = await operationsClient.wait({
operation: operation.name,
project: projectId,
zone,
});
}
}

module.exports = {
generateTestId,
getStaleVMInstances,
deleteInstance,
};

0 comments on commit 5eb4758

Please sign in to comment.