Added Vultr provider

This commit is contained in:
Ivan Gromov 2020-08-08 01:38:12 +05:00
parent 97d3fabde2
commit 97a931d3d8
3 changed files with 134 additions and 3 deletions

View file

@ -3,10 +3,11 @@ import json
import yaml
import boto3
from os.path import join, dirname
from aiohttp import web
from os.path import join, dirname, expanduser
from aiohttp import web, ClientSession
import concurrent.futures
import sys
import os
from google.auth.transport.requests import AuthorizedSession
from google.oauth2 import service_account
@ -165,6 +166,32 @@ async def gce_regions(request):
return web.json_response(json.loads(response.content))
@routes.get('/vultr_config')
async def check_vultr_config(request):
default_path = expanduser(join('~', '.vultr.ini'))
response = {'path': None}
try:
open(default_path, 'r').read()
response['path'] = default_path
except IOError:
pass
if 'VULTR_API_CONFIG' in os.environ:
try:
open(os.environ['VULTR_API_CONFIG'], 'r').read()
response['path'] = os.environ['VULTR_API_CONFIG']
except IOError:
pass
return web.json_response(response)
@routes.get('/vultr_regions')
async def vultr_regions(request):
async with ClientSession() as session:
async with session.get('https://api.vultr.com/v1/regions/list') as r:
json_body = await r.json()
return web.json_response(json_body)
app = web.Application()
app.router.add_routes(routes)
app.add_routes([web.static('/static', join(PROJECT_ROOT, 'app', 'static'))])

View file

@ -60,7 +60,8 @@ module.exports = {
'digitalocean': window.httpVueLoader('/static/provider-do.vue'),
'lightsail': window.httpVueLoader('/static/provider-lightsail.vue'),
'ec2': window.httpVueLoader('/static/provider-ec2.vue'),
'gce': window.httpVueLoader('/static/provider-gce.vue')
'gce': window.httpVueLoader('/static/provider-gce.vue'),
'vultr': window.httpVueLoader('/static/provider-vultr.vue')
}
};
</script>

View file

@ -0,0 +1,103 @@
<template>
<div>
<div class="form-group">
<label
>Enter the local path to your configuration INI file
<a
href="https://trailofbits.github.io/algo/cloud-vultr.html"
title="https://trailofbits.github.io/algo/cloud-vultr.html"
target="_blank"
rel="noreferrer noopener"
class="badge bagde-pill badge-primary"
>?</a
></label
>
<input
type="text"
class="form-control"
name="vultr_config"
v-bind:disabled="ui_loading_check"
v-model="vultr_config"
/>
</div>
<div class="form-group">
<region-select v-model="region"
v-bind:options="ui_region_options"
v-bind:loading="ui_loading_check || ui_loading_regions">
</region-select>
</div>
<button
class="btn btn-primary"
type="button"
v-on:click="submit"
v-bind:disabled="!is_valid"
>
Next
</button>
</div>
</template>
<script>
module.exports = {
data: function () {
return {
vultr_config: null,
region: null,
// helper variables
ui_loading_check: false,
ui_loading_regions: false,
ui_region_options: []
};
},
created: function() {
this.check_config();
this.load_regions();
},
computed: {
is_valid() {
return this.vultr_config && this.region;
}
},
methods: {
check_config() {
this.ui_loading_check = true;
fetch("/vultr_config")
.then(r => r.json())
.then(response => {
if (response.path) {
this.vultr_config = response.path;
}
})
.finally(() => {
this.ui_loading_check = false;
});
},
load_regions() {
this.ui_loading_regions = true;
fetch("/vultr_regions")
.then((r) => r.json())
.then((data) => {
this.ui_region_options = Object.keys(data).map(k => ({
value: data[k].name,
key: data[k].name
}));
})
.finally(() => {
this.ui_loading_regions = false;
});
},
submit() {
this.$emit("submit", {
vultr_config: this.vultr_config,
region: this.region
});
},
},
components: {
"region-select": window.httpVueLoader("/static/region-select.vue"),
},
};
</script>