Skip to content

Instantly share code, notes, and snippets.

@yuvipanda
Created September 24, 2019 23:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yuvipanda/cb918977ba8db42c93f3db726e5cbca4 to your computer and use it in GitHub Desktop.
Save yuvipanda/cb918977ba8db42c93f3db726e5cbca4 to your computer and use it in GitHub Desktop.
Start a VM with Pangeo image & let you access it
#!/usr/bin/env python
import re
import subprocess
import time
import argparse
import json
IMAGE = 'pangeo/base-notebook:2019.09.21'
ZONE = 'us-central1-b'
def gcloud(args):
return subprocess.run(['gcloud'] + list(args), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
def spawn_container(name):
network_tag = f'autocreated-instance-{name}'
create_vm = [
'compute', 'instances',
'create-with-container',
name,
'--container-image', IMAGE,
'--container-tty', '--container-stdin',
'--zone', ZONE,
'--tags', network_tag
]
gcloud(create_vm)
create_firewall = [
'compute', 'firewall-rules',
'create', f'allow-http-{network_tag}',
'--allow', 'tcp:8888',
'--target-tags', network_tag
]
gcloud(create_firewall)
def execute_command(name, command):
cmd = [
'compute', 'ssh',
'--zone', ZONE,
name,
'--'
] + command
return gcloud(cmd)
def wait_for_container(name):
while True:
check_container = execute_command(name, ['docker', 'ps', '--filter', f'ancestor={IMAGE}', '-q'])
container_id = check_container.stdout.decode().strip()
if container_id != '':
return container_id
time.sleep(2)
def get_container_logs(name):
container_id = wait_for_container(name)
logs_output = execute_command(name, [
'docker', 'logs',
container_id
])
logs = logs_output.stdout.decode().strip()
return logs
def get_jupyter_token(name):
logs = get_container_logs(name)
return re.search(r':8888/\?token=(.*)$', logs, re.MULTILINE)[1].strip()
def get_external_ip(name):
cmd = [
'compute', 'instances',
'list',
'--format', 'json',
'--filter', f'name={name}'
]
vm_info = json.loads(gcloud(cmd).stdout.decode().strip())[0]
return vm_info['networkInterfaces'][0]['accessConfigs'][0]['natIP']
def main():
argparser = argparse.ArgumentParser()
argparser.add_argument('name')
args = argparser.parse_args()
print('creating VM...')
spawn_container(args.name)
print('VM Created!')
print('Getting Jupyter Secret Token...')
jupyter_token = get_jupyter_token(args.name)
print('Jupyter Secret Token retreived!')
external_ip = get_external_ip(args.name)
print('Access your Jupyter Notebook at:')
print(f'http://{external_ip}:8888/?token={jupyter_token}')
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment