blob: 613756404949178e569cbea555cd16c3c41f027e [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# libcloud.org licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Provides zope.interface definitions for libcloud.
"""
from zope.interface import Interface, Attribute
class INode(Interface):
"""
A node (instance, etc)
"""
uuid = Attribute("""Unique identifier""")
id = Attribute("""Unique ID provided by the provider (i-abcd1234, etc)""")
name = Attribute("""Hostname or similar identifier""")
state = Attribute("""A standard Node state as provided by L{NodeState}""")
public_ip = Attribute("""List of Public IPs of the Node""")
private_ip = Attribute("""List of Private IPs of the Node""")
driver = Attribute("""The NodeDriver that belongs to this Node""")
extra = Attribute("""Dict containing provider specific data""")
def get_uuid():
"""
Provides a system wide unique ID for the node
"""
def destroy():
"""
Call `self.driver.destroy_node(self)`. A convenience method.
"""
def reboot():
"""
Call `self.driver.reboot_node(self)`. A convenience method.
"""
class INodeFactory(Interface):
"""
Create nodes
"""
def __call__(id, name, state, public_ip, private_ip, driver):
"""
Set values for ivars, including any other requisite kwargs
"""
class INodeSize(Interface):
"""
A machine image
"""
id = Attribute("""Unique ID provided by the provider (m1.small, etc)""")
name = Attribute("""Name provided by the provider (Small CPU, etc)""")
ram = Attribute("""Amount of RAM provided in MB (256MB, 1740MB)""")
disk = Attribute("""Amount of disk provided in GB (200GB)""")
bandwidth = Attribute("""Amount of total transfer bandwidth in GB""")
price = Attribute("""Hourly price of this server in USD, estimated if
monthly""")
driver = Attribute("""The NodeDriver that belongs to this Image""")
class INodeSizeFactory(Interface):
"""
Create nodes
"""
def __call__(id, name, ram, disk, bandwidth, price, driver):
"""
Set values for ivars, including any other requisite kwargs
"""
class INodeImage(Interface):
"""
A machine image
"""
id = Attribute("""Unique ID provided by the provider (ami-abcd1234)""")
name = Attribute("""Name provided by the provider (Ubuntu 8.1)""")
driver = Attribute("""The NodeDriver that belongs to this Image""")
extra = Attribute("""Dict containing provider specific data""")
class INodeImageFactory(Interface):
"""
Create nodes
"""
def __call__(id, name, driver):
"""
Set values for ivars, including any other requisite kwargs
"""
class INodeLocation(Interface):
"""
Physical Location of a node
"""
id = Attribute("""Unique ID provided by the provider for a physical
datacenter""")
name = Attribute("""Name provided by the provider ('Austin Texas DC 1')""")
country = Attribute("""ISO 3166 country code of the physical location of
the data center <http://bit.ly/pKie5> (iso.org)""")
driver = Attribute("""The NodeDriver that belongs to this Location""")
class INodeLocationFactory(Interface):
"""
Create nodes location
"""
def __call__(id, name, country, driver):
"""
Set values for ivars, including any other requisite kwargs
"""
class INodeDriverFactory(Interface):
"""
Create NodeDrivers
"""
def __call__(key, secret=None, secure=True):
"""
Set of value for ivars
"""
class INodeDriver(Interface):
"""
A driver which provides nodes, such as an Amazon EC2 instance,
or Slicehost slice
"""
connection = Attribute("""Represents the IConnection for this driver""")
type = Attribute("""The type of this provider as defined by L{Provider}""")
name = Attribute("""A pretty name (Linode, etc) for this provider""")
NODE_STATE_MAP = Attribute("""A mapping of states found in the response to
their standard type. This is a constant.""")
def create_node(**kwargs):
"""
Creates a new node based on provided params. Name is ignored on
some providers.
To specify provider-specific options, use keyword arguments.
"""
def destroy_node(node):
"""
Returns True if the destroy was successful, otherwise False
"""
def list_nodes():
"""
Returns a list of nodes for this provider
"""
def list_images(location=None):
"""
Returns a list of images for this provider
"""
def list_sizes(location=None):
"""
Returns a list of sizes for this provider
"""
def list_locations():
"""
Returns a list of locations for this prodiver
"""
def reboot_node(node):
"""
Returns True if the reboot was successful, otherwise False
"""
class IConnection(Interface):
"""
A Connection represents an interface between a Client and a Provider's Web
Service. It is capable of authenticating, making requests, and returning
responses.
"""
conn_classes = Attribute("""Classes used to create connections, should be
in the form of `(insecure, secure)`""")
responseCls = Attribute("""Provider-specific Class used for creating
responses""")
connection = Attribute("""Represents the lower-level connection to the
server""")
host = Attribute("""Default host for this connection""")
port = Attribute("""Default port for this connection. This should be a
tuple of the form `(insecure, secure)` or for single-port
Providers, simply `(port,)`""")
secure = Attribute("""Indicates if this is a secure connection. If previous
recommendations were followed, it would be advantageous
for this to be in the form: 0=insecure, 1=secure""")
driver = Attribute("""The NodeDriver that belongs to this Node""")
def connect(host=None, port=None):
"""
A method for establishing a connection. If no host or port are given,
existing ivars should be used.
"""
def request(action, params={}, data='', method='GET'):
"""
Make a request.
An `action` should represent a path, such as `/list/nodes`. Query
parameters necessary to the request should be passed in `params` and
any data to encode goes in `data`. `method` should be one of: (GET,
POST).
Should return a response object (specific to a provider).
"""
def add_default_params(params):
"""
Adds default parameters (such as API key, version, etc.)
to the passed `params`
Should return a dictionary.
"""
def add_default_headers(headers):
"""
Adds default headers (such as Authorization, X-Foo-Bar)
to the passed `headers`
Should return a dictionary.
"""
def encode_data(data):
"""
Data may need to be encoded before sent in a request.
If not, simply return the data.
"""
class IConnectionKey(IConnection):
"""
IConnection which only depends on an API key for authentication.
"""
key = Attribute("""API key, token, etc.""")
class IConnectionUserAndKey(IConnectionKey):
"""
IConnection which depends on a user identifier and an API
for authentication.
"""
user_id = Attribute("""User identifier""")
class IConnectionKeyFactory(Interface):
"""
Create Connections which depend solely on an API key.
"""
def __call__(key, secure=True):
"""
Create a Connection.
The acceptance of only `key` provides support for APIs with only one
authentication bit.
The `secure` argument indicates whether or not a secure connection
should be made. Not all providers support this, so it may be ignored.
"""
class IConnectionUserAndKeyFactory(Interface):
"""
Create Connections which depends on both a user identifier and API key.
"""
def __call__(user_id, key, secure=True):
"""
Create a Connection.
The first two arguments provide the initial values for `user_id` and
`key`, respectively, which should be used for authentication.
The `secure` argument indicates whether or not a secure connection
should be made. Not all providers support this, so it may be ignored.
"""
class IResponse(Interface):
"""
A response as provided by a given HTTP Client.
"""
object = Attribute("""The processed response object,
e.g. via lxml or json""")
body = Attribute("""Unparsed response body""")
status = Attribute("""Response status code""")
headers = Attribute("""Response headers""")
error = Attribute("""Response error, L{None} if no error.""")
connection = Attribute("""Represents the IConnection for this response""")
def parse_body():
"""
Parse the response body (as XML, etc.)
"""
def parse_error():
"""
Parse the error that is contained in the response body (as XML, etc.)
"""
def success():
"""
Does the response indicate a successful request?
"""
class IResponseFactory(Interface):
"""
Creates Responses.
"""
def __call__(response):
"""
Process the given response, setting ivars.
"""