Mercurial > repos > shellac > guppy_basecaller
diff env/lib/python3.7/site-packages/boto/mashups/server.py @ 5:9b1c78e6ba9c draft default tip
"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
author | shellac |
---|---|
date | Mon, 01 Jun 2020 08:59:25 -0400 |
parents | 79f47841a781 |
children |
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/boto/mashups/server.py Thu May 14 16:47:39 2020 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,395 +0,0 @@ -# Copyright (c) 2006,2007 Mitch Garnaat http://garnaat.org/ -# -# Permission is hereby granted, free of charge, to any person obtaining a -# copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, dis- -# tribute, sublicense, and/or sell copies of the Software, and to permit -# persons to whom the Software is furnished to do so, subject to the fol- -# lowing conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- -# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -# IN THE SOFTWARE. -""" -High-level abstraction of an EC2 server -""" - -import boto -import boto.utils -from boto.compat import StringIO -from boto.mashups.iobject import IObject -from boto.pyami.config import Config, BotoConfigPath -from boto.mashups.interactive import interactive_shell -from boto.sdb.db.model import Model -from boto.sdb.db.property import StringProperty -import os - - -class ServerSet(list): - - def __getattr__(self, name): - results = [] - is_callable = False - for server in self: - try: - val = getattr(server, name) - if callable(val): - is_callable = True - results.append(val) - except: - results.append(None) - if is_callable: - self.map_list = results - return self.map - return results - - def map(self, *args): - results = [] - for fn in self.map_list: - results.append(fn(*args)) - return results - -class Server(Model): - - @property - def ec2(self): - if self._ec2 is None: - self._ec2 = boto.connect_ec2() - return self._ec2 - - @classmethod - def Inventory(cls): - """ - Returns a list of Server instances, one for each Server object - persisted in the db - """ - l = ServerSet() - rs = cls.find() - for server in rs: - l.append(server) - return l - - @classmethod - def Register(cls, name, instance_id, description=''): - s = cls() - s.name = name - s.instance_id = instance_id - s.description = description - s.save() - return s - - def __init__(self, id=None, **kw): - super(Server, self).__init__(id, **kw) - self._reservation = None - self._instance = None - self._ssh_client = None - self._pkey = None - self._config = None - self._ec2 = None - - name = StringProperty(unique=True, verbose_name="Name") - instance_id = StringProperty(verbose_name="Instance ID") - config_uri = StringProperty() - ami_id = StringProperty(verbose_name="AMI ID") - zone = StringProperty(verbose_name="Availability Zone") - security_group = StringProperty(verbose_name="Security Group", default="default") - key_name = StringProperty(verbose_name="Key Name") - elastic_ip = StringProperty(verbose_name="Elastic IP") - instance_type = StringProperty(verbose_name="Instance Type") - description = StringProperty(verbose_name="Description") - log = StringProperty() - - def setReadOnly(self, value): - raise AttributeError - - def getInstance(self): - if not self._instance: - if self.instance_id: - try: - rs = self.ec2.get_all_reservations([self.instance_id]) - except: - return None - if len(rs) > 0: - self._reservation = rs[0] - self._instance = self._reservation.instances[0] - return self._instance - - instance = property(getInstance, setReadOnly, None, 'The Instance for the server') - - def getAMI(self): - if self.instance: - return self.instance.image_id - - ami = property(getAMI, setReadOnly, None, 'The AMI for the server') - - def getStatus(self): - if self.instance: - self.instance.update() - return self.instance.state - - status = property(getStatus, setReadOnly, None, - 'The status of the server') - - def getHostname(self): - if self.instance: - return self.instance.public_dns_name - - hostname = property(getHostname, setReadOnly, None, - 'The public DNS name of the server') - - def getPrivateHostname(self): - if self.instance: - return self.instance.private_dns_name - - private_hostname = property(getPrivateHostname, setReadOnly, None, - 'The private DNS name of the server') - - def getLaunchTime(self): - if self.instance: - return self.instance.launch_time - - launch_time = property(getLaunchTime, setReadOnly, None, - 'The time the Server was started') - - def getConsoleOutput(self): - if self.instance: - return self.instance.get_console_output() - - console_output = property(getConsoleOutput, setReadOnly, None, - 'Retrieve the console output for server') - - def getGroups(self): - if self._reservation: - return self._reservation.groups - else: - return None - - groups = property(getGroups, setReadOnly, None, - 'The Security Groups controlling access to this server') - - def getConfig(self): - if not self._config: - remote_file = BotoConfigPath - local_file = '%s.ini' % self.instance.id - self.get_file(remote_file, local_file) - self._config = Config(local_file) - return self._config - - def setConfig(self, config): - local_file = '%s.ini' % self.instance.id - fp = open(local_file) - config.write(fp) - fp.close() - self.put_file(local_file, BotoConfigPath) - self._config = config - - config = property(getConfig, setConfig, None, - 'The instance data for this server') - - def set_config(self, config): - """ - Set SDB based config - """ - self._config = config - self._config.dump_to_sdb("botoConfigs", self.id) - - def load_config(self): - self._config = Config(do_load=False) - self._config.load_from_sdb("botoConfigs", self.id) - - def stop(self): - if self.instance: - self.instance.stop() - - def start(self): - self.stop() - ec2 = boto.connect_ec2() - ami = ec2.get_all_images(image_ids = [str(self.ami_id)])[0] - groups = ec2.get_all_security_groups(groupnames=[str(self.security_group)]) - if not self._config: - self.load_config() - if not self._config.has_section("Credentials"): - self._config.add_section("Credentials") - self._config.set("Credentials", "aws_access_key_id", ec2.aws_access_key_id) - self._config.set("Credentials", "aws_secret_access_key", ec2.aws_secret_access_key) - - if not self._config.has_section("Pyami"): - self._config.add_section("Pyami") - - if self._manager.domain: - self._config.set('Pyami', 'server_sdb_domain', self._manager.domain.name) - self._config.set("Pyami", 'server_sdb_name', self.name) - - cfg = StringIO() - self._config.write(cfg) - cfg = cfg.getvalue() - r = ami.run(min_count=1, - max_count=1, - key_name=self.key_name, - security_groups = groups, - instance_type = self.instance_type, - placement = self.zone, - user_data = cfg) - i = r.instances[0] - self.instance_id = i.id - self.put() - if self.elastic_ip: - ec2.associate_address(self.instance_id, self.elastic_ip) - - def reboot(self): - if self.instance: - self.instance.reboot() - - def get_ssh_client(self, key_file=None, host_key_file='~/.ssh/known_hosts', - uname='root'): - import paramiko - if not self.instance: - print('No instance yet!') - return - if not self._ssh_client: - if not key_file: - iobject = IObject() - key_file = iobject.get_filename('Path to OpenSSH Key file') - self._pkey = paramiko.RSAKey.from_private_key_file(key_file) - self._ssh_client = paramiko.SSHClient() - self._ssh_client.load_system_host_keys() - self._ssh_client.load_host_keys(os.path.expanduser(host_key_file)) - self._ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) - self._ssh_client.connect(self.instance.public_dns_name, - username=uname, pkey=self._pkey) - return self._ssh_client - - def get_file(self, remotepath, localpath): - ssh_client = self.get_ssh_client() - sftp_client = ssh_client.open_sftp() - sftp_client.get(remotepath, localpath) - - def put_file(self, localpath, remotepath): - ssh_client = self.get_ssh_client() - sftp_client = ssh_client.open_sftp() - sftp_client.put(localpath, remotepath) - - def listdir(self, remotepath): - ssh_client = self.get_ssh_client() - sftp_client = ssh_client.open_sftp() - return sftp_client.listdir(remotepath) - - def shell(self, key_file=None): - ssh_client = self.get_ssh_client(key_file) - channel = ssh_client.invoke_shell() - interactive_shell(channel) - - def bundle_image(self, prefix, key_file, cert_file, size): - print('bundling image...') - print('\tcopying cert and pk over to /mnt directory on server') - ssh_client = self.get_ssh_client() - sftp_client = ssh_client.open_sftp() - path, name = os.path.split(key_file) - remote_key_file = '/mnt/%s' % name - self.put_file(key_file, remote_key_file) - path, name = os.path.split(cert_file) - remote_cert_file = '/mnt/%s' % name - self.put_file(cert_file, remote_cert_file) - print('\tdeleting %s' % BotoConfigPath) - # delete the metadata.ini file if it exists - try: - sftp_client.remove(BotoConfigPath) - except: - pass - command = 'sudo ec2-bundle-vol ' - command += '-c %s -k %s ' % (remote_cert_file, remote_key_file) - command += '-u %s ' % self._reservation.owner_id - command += '-p %s ' % prefix - command += '-s %d ' % size - command += '-d /mnt ' - if self.instance.instance_type == 'm1.small' or self.instance_type == 'c1.medium': - command += '-r i386' - else: - command += '-r x86_64' - print('\t%s' % command) - t = ssh_client.exec_command(command) - response = t[1].read() - print('\t%s' % response) - print('\t%s' % t[2].read()) - print('...complete!') - - def upload_bundle(self, bucket, prefix): - print('uploading bundle...') - command = 'ec2-upload-bundle ' - command += '-m /mnt/%s.manifest.xml ' % prefix - command += '-b %s ' % bucket - command += '-a %s ' % self.ec2.aws_access_key_id - command += '-s %s ' % self.ec2.aws_secret_access_key - print('\t%s' % command) - ssh_client = self.get_ssh_client() - t = ssh_client.exec_command(command) - response = t[1].read() - print('\t%s' % response) - print('\t%s' % t[2].read()) - print('...complete!') - - def create_image(self, bucket=None, prefix=None, key_file=None, cert_file=None, size=None): - iobject = IObject() - if not bucket: - bucket = iobject.get_string('Name of S3 bucket') - if not prefix: - prefix = iobject.get_string('Prefix for AMI file') - if not key_file: - key_file = iobject.get_filename('Path to RSA private key file') - if not cert_file: - cert_file = iobject.get_filename('Path to RSA public cert file') - if not size: - size = iobject.get_int('Size (in MB) of bundled image') - self.bundle_image(prefix, key_file, cert_file, size) - self.upload_bundle(bucket, prefix) - print('registering image...') - self.image_id = self.ec2.register_image('%s/%s.manifest.xml' % (bucket, prefix)) - return self.image_id - - def attach_volume(self, volume, device="/dev/sdp"): - """ - Attach an EBS volume to this server - - :param volume: EBS Volume to attach - :type volume: boto.ec2.volume.Volume - - :param device: Device to attach to (default to /dev/sdp) - :type device: string - """ - if hasattr(volume, "id"): - volume_id = volume.id - else: - volume_id = volume - return self.ec2.attach_volume(volume_id=volume_id, instance_id=self.instance_id, device=device) - - def detach_volume(self, volume): - """ - Detach an EBS volume from this server - - :param volume: EBS Volume to detach - :type volume: boto.ec2.volume.Volume - """ - if hasattr(volume, "id"): - volume_id = volume.id - else: - volume_id = volume - return self.ec2.detach_volume(volume_id=volume_id, instance_id=self.instance_id) - - def install_package(self, package_name): - print('installing %s...' % package_name) - command = 'yum -y install %s' % package_name - print('\t%s' % command) - ssh_client = self.get_ssh_client() - t = ssh_client.exec_command(command) - response = t[1].read() - print('\t%s' % response) - print('\t%s' % t[2].read()) - print('...complete!')