Skip to content
This repository has been archived by the owner on Nov 3, 2020. It is now read-only.

Added Snapshots #14

Merged
merged 4 commits into from Dec 19, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
@@ -1,4 +1,5 @@
node_modules
yarn-error.log
package-lock.json
yarn.lock
yarn.lock
.DS_Store
16 changes: 16 additions & 0 deletions README.md
Expand Up @@ -38,6 +38,12 @@ shark create droplet
```


To create snapshot
```sh
shark create snapshot
```


To create ssh_key
```sh
shark create ssh_key
Expand Down Expand Up @@ -79,6 +85,11 @@ To delete droplet
shark delete droplet
```

To delete snapshot
```sh
shark delete snapshot
```

To delete ssh_key
```sh
shark delete ssh_key
Expand Down Expand Up @@ -108,6 +119,11 @@ To list droplets
shark list droplets
```

To list droplets
```
shark list snapshots
```

To list ssh_keys
```
shark list ssh_keys
Expand Down
23 changes: 23 additions & 0 deletions cmds/create.js
Expand Up @@ -82,6 +82,29 @@ module.exports.floating_ip = async () => {
}
};

module.exports.snapshot = async () => {
try {
const answers = await Create.snapshot();
spinner.start('Creating snapshot..');
const {
body: { action }
} = await DoAPI.dropletsRequestAction(
answers.droplet.id,
{
type: 'snapshot',
name: answers.snapshot_name
}
);

if (action) {
spinner.succeed('Snapshot is being created!');
}
} catch (error) {
spinner.stop();
console.log(error.message);
}
};

module.exports.volume = async () => {
try {
const answers = await Create.volume();
Expand Down
30 changes: 30 additions & 0 deletions cmds/delete.js
Expand Up @@ -49,6 +49,36 @@ module.exports.droplet = async () => {
}
};

module.exports.snapshot = async () => {
try {
const answers = await deletePrompts.snapshot();
if (answers.snapshots.length > 0) {
const { delete_snapshot } = await deletePrompts.confirmDelete('snapshot');
if (delete_snapshot) {
spinner.start('Deleting your snapshot...');
answers.snapshots.map(async snapshot => {
try {
const data = await DoAPI.snapshotsDeleteById(snapshot);
if (data.response.statusCode === 204) {
spinner.succeed(`${snapshot} is deleted!`);
}
} catch (error) {
spinner.fail(`failed to delete ${snapshot}`);
console.log(error.message);
}
});
}
} else {
console.log(
'Please select atleast one snapshot to perform this operation!'
);
}
} catch (error) {
spinner.stop();
console.error(error);
}
};

module.exports.ssh_key = async () => {
try {
const answers = await deletePrompts.ssh_key();
Expand Down
35 changes: 35 additions & 0 deletions cmds/list.js
Expand Up @@ -75,6 +75,41 @@ ${chalk.bold(' CE:')} ${calData.totalCost.toLocaleString('en-US', {
}
};

module.exports.snapshots = async () => {
try {
spinner.start('Loading Snapshot...');
const list = await DoAPI.snapshots();
spinner.stop();
if (list.body.meta.total === 0) {
/* prettier-ignore */
console.log('You don\'t have any snapshots');
} else {
console.log(
`You have ${chalk.magenta(list.body.meta.total)} ${
list.body.meta.total > 1 ? 'Snapshots' : 'Snapshot'
}`
);
list.body.snapshots.map(snapshot => {
/* eslint-disable indent */
return console.log(
`----------------------
${chalk.bold(' Name:')} ${chalk.blue(snapshot.name)}
${chalk.bold(' Id:')} ${snapshot.id}
${chalk.bold(' Created at:')} ${snapshot.created_at}
${chalk.bold('Ressource Id:')} ${snapshot.resource_id}
${chalk.bold(' Size:')} ${snapshot.size_gigabytes}
${chalk.bold(' Regions:')} ${snapshot.regions}
`
);
/* eslint-enable */
});
}
} catch (error) {
spinner.stop();
console.error(error);
}
};

module.exports.ssh_keys = async () => {
try {
spinner.start('Loading sshkeys...');
Expand Down
23 changes: 23 additions & 0 deletions loaders.js
Expand Up @@ -158,6 +158,29 @@ module.exports.loadAvailableImages = async () => {
}
};

module.exports.loadAvailableSnapshots = async () => {
try {
spinner.start('Loading available snapshots...');
const data = await DoAPI.snapshots();
spinner.stop();
const availableSnapshots = [];
if (data.body.meta.total === 0) {
console.log('You donn\'t have any snapshots');
process.exit();
} else {
data.body.snapshots.map(snapshot =>
availableSnapshots.push({
name: snapshot.name,
value: snapshot.id
})
);
return availableSnapshots;
}
} catch (error) {
console.error(error);
}
};

module.exports.loadAvailableSSHKEYS = async () => {
try {
spinner.start('Loading your ssh_keys...');
Expand Down
22 changes: 21 additions & 1 deletion prompts/create.js
Expand Up @@ -5,7 +5,8 @@ const {
loadAvailableRegions,
loadAvailableSizes,
loadAvailableImages,
loadAvailableSSHKEYS
loadAvailableSSHKEYS,
loadAvailableDroplets
} = require('../loaders');

module.exports.init = () => {
Expand All @@ -16,6 +17,7 @@ module.exports.init = () => {
message: 'What do you want to create?',
choices: [
{ name: 'Droplet', value: 'droplet' },
{ name: 'Snapshot', value: 'snapshot' },
{ name: 'Floating Ip', value: 'floating_ip' },
{ name: 'SSH Key', value: 'ssh_key' },
{ name: 'Volume', value: 'volume' },
Expand Down Expand Up @@ -138,6 +140,24 @@ module.exports.floating_ip = async () => {
return inquirer.prompt(questions);
};

module.exports.snapshot = async () => {
const questions = [
{
type: 'list',
name: 'droplet',
message: 'Select of which droplet you want to create a snapshot',
choices: await loadAvailableDroplets()
},
{
type: 'input',
name: 'snapshot_name',
message: 'Input your Snapshot Name'
}
];

return inquirer.prompt(questions);
};

module.exports.volume = async () => {
const questions = [
{
Expand Down
15 changes: 15 additions & 0 deletions prompts/delete.js
Expand Up @@ -3,6 +3,7 @@ const inquirer = require('inquirer');
const chalk = require('chalk');
const {
loadAvailableDroplets,
loadAvailableSnapshots,
loadAvailableSSHKEYS,
loadAvailableFloatingIps,
loadAvailableVolumes
Expand All @@ -16,6 +17,7 @@ module.exports.init = () => {
message: 'What do you want to Delete?',
choices: [
{ name: 'Droplet', value: 'droplet' },
{ name: 'Snapshot', value: 'snapshot' },
{ name: 'Floating Ip', value: 'floating_ip' },
{ name: 'SSH Key', value: 'ssh_key' },
{ name: 'Volume', value: 'volume' },
Expand All @@ -41,6 +43,19 @@ module.exports.droplet = async () => {
return inquirer.prompt(questions);
};

module.exports.snapshot = async () => {
const questions = [
{
type: 'checkbox',
name: 'snapshots',
message: 'Select the snapshot you want to delete:',
choices: await loadAvailableSnapshots()
}
];

return inquirer.prompt(questions);
};

module.exports.ssh_key = async () => {
const questions = [
{
Expand Down
1 change: 1 addition & 0 deletions prompts/list.js
Expand Up @@ -9,6 +9,7 @@ module.exports.init = () => {
message: 'What do you want to list?',
choices: [
{ name: 'Droplets', value: 'droplets' },
{ name: 'Snapshots', value: 'snapshots' },
{ name: 'SSH Keys', value: 'ssh_keys' },
{ name: 'Floating Ips', value: 'floating_ips' },
{ name: 'Volumes', value: 'volumes' },
Expand Down