def envy_dotfiles(args): """Upload user dotfiles from local machine.""" config = _get_config(args) # if user defines -n in cli, append name to project name. if args.name: config['project_config']['name'] = '%s-%s' % ( config['project_config']['name'], args.name) envy = Envy(config) if envy.ip(): host_string = '%s@%s' % (envy.remote_user, envy.ip()) temp_tar = tempfile.NamedTemporaryFile(delete=True) with fabric.api.settings(host_string=host_string): dotfiles = ['.vimrc', '.gitconfig', '.gitignore', '.screenrc'] with tarfile.open(temp_tar.name, 'w') as archive: for dotfile in dotfiles: path = os.path.expanduser('~/%s' % dotfile) if os.path.exists(path): tarinfo = tarfile.TarInfo(name=dotfile) tarinfo.mtime = time.time() tarinfo.mode = 0755 archive.addfile(tarinfo, fileobj=open(path)) fabric.operations.put(temp_tar, '~/dotfiles.tar') fabric.operations.run('tar -xvf ~/dotfiles.tar') else: logging.error('Could not find IP to upload file to.')
def envy_up(args): """Create a server and show its IP.""" config = _get_config(args) # if user defines -n in cli, append name to project name. if args.name: config['project_config']['name'] = '%s-%s' % ( config['project_config']['name'], args.name) envy = Envy(config) if not envy.server(): logging.info('Building environment.') try: envy.build_server() except exceptions.ImageNotFound: logging.error('Could not find image.') return except exceptions.NoIPsAvailable: logging.error('Could not find free IP.') return if envy.auto_provision: envy_provision(args) if envy.ip(): print envy.ip() else: print 'Environment has no IP.'
def envy_list(args): """List all ENVys in context of your current project""" config = _get_config(args) envy = Envy(config) foo = envy.list_servers() envys = [] for server in foo: if len(server.name.split(envy.name)) > 1: envys.append(str(server.name)) print "ENVys for your project: %s" % str(envys)
def envy_snapshot(args, name=None): """Create a snapshot of a running server.""" config = _get_config(args) # if user defines -n in cli, append name to project name. if args.name: config['project_config']['name'] = '%s-%s' % ( config['project_config']['name'], args.name) envy = Envy(config) envy.snapshot(name or ('%s-snapshot' % envy.name))
def envy_provision(args): """Manually provision a remote environment using a userdata script.""" config = _get_config(args) # if user defines -n in cli, append name to project name. if args.name: config['project_config']['name'] = '%s-%s' % ( config['project_config']['name'], args.name) envy = Envy(config) logging.info('Provisioning %s environment...' % config['project_config']['name']) if args.remote_user: config['project_config']['remote_user'] = args.remote_user if args.userdata: config['project_config']['provision_script_path'] = args.userdata remote_user = config['project_config']['remote_user'] try: provision_script_path = config['project_config'][ 'provision_script_path'] except KeyError: raise SystemExit('Please specify which provision script should be used' ' by passing in `-u` to the provision command, or by ' 'defining `provision_script_path` in ./Envyfile') remote_provision_script_path = '~/provision_script' logging.info('Using userdata from: %s', provision_script_path) with fabric.api.settings(host_string=envy.ip(), user=remote_user, forward_agent=True, disable_known_hosts=True): for i in range(12): try: fabric.operations.put(provision_script_path, remote_provision_script_path, mode=0755) break except fabric.exceptions.NetworkError: logging.error("Unable to upload file. Your cloud instance is " "probably not yet built. Trying again in 10 " "seconds.") time.sleep(10) fabric.operations.run(remote_provision_script_path) logging.info('...done.')
def envy_ssh(args): """SSH into the current server.""" config = _get_config(args) # if user defines -n in cli, append name to project name. if args.name: config['project_config']['name'] = '%s-%s' % ( config['project_config']['name'], args.name) envy = Envy(config) remote_user = config['project_config']['remote_user'] if envy.ip(): disable_known_hosts = ('-o UserKnownHostsFile=/dev/null' ' -o StrictHostKeyChecking=no') fabric.operations.local('ssh %s %s@%s' % (disable_known_hosts, remote_user, envy.ip())) else: logging.error('Could not find IP.')
def envy_ip(args): """Show the IP of the current server.""" config = _get_config(args) # if user defines -n in cli, append name to project name. if args.name: config['project_config']['name'] = '%s-%s' % ( config['project_config']['name'], args.name) envy = Envy(config) if not envy.server(): logging.error('Environment has not been created.\n' 'Try running `envy up` first?') elif envy.ip(): print envy.ip() else: logging.error('Could not find IP.')
def envy_destroy(args): """Power-off and destroy the current server.""" config = _get_config(args) # if user defines -n in cli, append name to project name. if args.name: config['project_config']['name'] = '%s-%s' % ( config['project_config']['name'], args.name) envy = Envy(config) logging.info('Triggering environment deletion.') if envy.find_server(): envy.delete_server() while envy.find_server(): logging.info('...waiting for server to be destroyed') time.sleep(1) logging.info('...done.') else: logging.error('No environment exists.')
def envy_scp(args): """SCP Files to your ENVy""" config = _get_config(args) # if user defines -n in cli, append name to project name. if args.name: config['project_config']['name'] = '%s-%s' % ( config['project_config']['name'], args.name) envy = Envy(config) if envy.ip(): remote_user = '******' host_string = '%s@%s' % (remote_user, envy.ip()) with fabric.api.settings(host_string=host_string): fabric.operations.put(args.source, args.target) else: logging.error('Could not find IP to upload file to.')