Source code for elasticluster.providers

#
# Copyright (C) 2013 GC3, University of Zurich
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
__author__ = 'Nicolas Baer <nicolas.baer@uzh.ch>'


# stdlib imports
from abc import ABCMeta, abstractmethod


[docs]class AbstractCloudProvider: """Defines the contract for a cloud provider to proper function with elasticluster. """ __metaclass__ = ABCMeta @abstractmethod def __init__(self, **config): """The constructor of a `CloudProvider` class is called only using keyword arguments. Usually these are configuration option of the corresponding `setup` section in the configuration file. """ pass @abstractmethod
[docs] def start_instance(self, key_name, public_key_path, private_key_path, security_group, flavor, image_id, image_userdata, username=None, node_name=None): """Starts a new instance on the cloud using the given properties. Multiple instances might be started in different threads at the same time. The implementation should handle any problems regarding this itself. :param str key_name: name of the ssh key to connect :param str public_key_path: path to ssh public key :param str private_key_path: path to ssh private key :param str security_group: firewall rule definition to apply on the instance :param str flavor: machine type to use for the instance :param str image_name: image type (os) to use for the instance :param str image_userdata: command to execute after startup :param str username: username for the given ssh key, default None :return: str - instance id of the started instance """ pass
@abstractmethod
[docs] def stop_instance(self, instance_id): """Stops the instance gracefully. :param str instance_id: instance identifier :return: None """ pass
@abstractmethod
[docs] def get_ips(self, instance_id): """Retrieves the private and public ip addresses for a given instance. :return: list (IPs) """ pass
@abstractmethod
[docs] def is_instance_running(self, instance_id): """Checks if the instance is up and running. :param str instance_id: instance identifier :return: bool - True if running, False otherwise """ pass
[docs]class AbstractSetupProvider: """ TODO: define... """ __metaclass__ = ABCMeta @abstractmethod
[docs] def setup_cluster(self, cluster): """Configures all nodes of a cluster to function in respect to the given configuration. This method *must* be idempotent, i.e. it should always be safe calling it multiple times.. :param cluster: cluster to configure :type cluster: :py:class:`elasticluster.cluster.Cluster` :return: `True` if the cluster is correctly configured, even if the method didn't actually do anything. `False` if the cluster is not configured. """ pass
@abstractmethod
[docs] def cleanup(self): """Cleanup any temporary file or directory created during setup. This method is called every time a cluster is stopped. :return: None """ pass