From 97d3fabde2aa95e5fa96518d3dfa025343ca502d Mon Sep 17 00:00:00 2001 From: Ivan Gromov Date: Mon, 20 Jul 2020 03:10:21 +0500 Subject: [PATCH] Added GCE provider --- app/server.py | 45 ++++++-- app/static/provider-gce.vue | 196 +++++++++++++++++++++++++++++----- app/static/provider-setup.vue | 3 +- app/static/region-select.vue | 44 ++++++++ 4 files changed, 252 insertions(+), 36 deletions(-) create mode 100644 app/static/region-select.vue diff --git a/app/server.py b/app/server.py index 6dba79c..f267301 100644 --- a/app/server.py +++ b/app/server.py @@ -21,7 +21,8 @@ task_program = '' def run_playbook(data): global task_program - extra_vars = ' '.join(['{0}={1}'.format(key, data[key]) for key in data.keys()]) + extra_vars = ' '.join(['{0}={1}'.format(key, data[key]) + for key in data.keys()]) task_program = ['ansible-playbook', 'main.yml', '--extra-vars', extra_vars] return PlaybookCLI(task_program).run() @@ -101,7 +102,7 @@ async def post_exit(_): @routes.post('/lightsail_regions') -async def post_exit(request): +async def lightsail_regions(request): data = await request.json() client = boto3.client( 'lightsail', @@ -115,7 +116,7 @@ async def post_exit(request): @routes.post('/ec2_regions') -async def post_exit(request): +async def ec2_regions(request): data = await request.json() client = boto3.client( 'ec2', @@ -126,16 +127,40 @@ async def post_exit(request): return web.json_response(response) +@routes.get('/gce_config') +async def check_gce_config(request): + gce_file = join(PROJECT_ROOT, 'configs', 'gce.json') + response = {} + try: + json.loads(open(gce_file, 'r').read())['project_id'] + response['status'] = 'ok' + except IOError: + response['status'] = 'not_available' + except ValueError: + response['status'] = 'wrong_format' + + return web.json_response(response) + + @routes.post('/gce_regions') -async def post_exit(request): - #data = await request.json() - gce_config_file = 'configs/gce.json' # 'data.get('gce_config_file') - project_id = json.loads(open(gce_config_file, 'r').read())['project_id'] +async def gce_regions(request): + data = await request.json() + gce_file_name = join(PROJECT_ROOT, 'configs', 'gce.json') + if data.get('project_id'): + # File is missing, save it. We can't get file path from browser :( + with open(gce_file_name, 'w') as f: + f.write(json.dumps(data)) + else: + with open(gce_file_name, 'r') as f: + data = json.loads(f.read()) response = AuthorizedSession( - service_account.Credentials.from_service_account_file(gce_config_file).with_scopes( - ['https://www.googleapis.com/auth/compute'])).get( - 'https://www.googleapis.com/compute/v1/projects/{project_id}/regions'.format(project_id=project_id)) + service_account.Credentials.from_service_account_info( + data).with_scopes( + ['https://www.googleapis.com/auth/compute'])).get( + 'https://www.googleapis.com/compute/v1/projects/{project_id}/regions'.format( + project_id=data['project_id']) + ) return web.json_response(json.loads(response.content)) diff --git a/app/static/provider-gce.vue b/app/static/provider-gce.vue index e202142..16f9c37 100644 --- a/app/static/provider-gce.vue +++ b/app/static/provider-gce.vue @@ -1,5 +1,44 @@