Jump to: navigation, search

Difference between revisions of "PythonOpenStackSDK/ClassDesignDiscussion"

(Introduction)
Line 1: Line 1:
== Introduction ==
+
= Design =
 +
The intention of this document is to give a high level picture of the design of the OpenStack Python SDK.  This document should cover how the SDK appears from the user perspective and important details of the internal design that the average user should not need to worry about.
  
The internal design of the OpenStack Python SDK is based on the [http://en.wikipedia.org/wiki/OSI_model OSI Model] where the application is the resource object.  The objects are described in more detail below.
+
== User Interface Design ==
[[File:OpenStack_Python_SDK_Stack.png|none|center|OpenStack Python SDK Stack]]
 
  
== Class Overview ==
+
===Internal Design ==
  
==== Client ====
+
=== Authenticator ===
For each service there is a single '''Client''' class that contains the interface that the application developer will work with. Any functionality in the SDK should be available as a method in the Client class. Each Client instance has a reference to an instance of its Manager class. There is no logic in the Client class except to pass the request to its manager, and return the result from the manager to the application.
 
  
==== Manager ====
+
=== Connection ===
The '''Manager''' class contains the logic to construct the appropriate URIs from the base endpoints (returned from the service catalog), and the particulars of the request. If needed, it also creates the appropriate data to include with the request. It then passes that request to the HTTP class, and handles the response. If there is an exception, the appropriate class of Exception is determined and raised with the information the developer would need to understand and correct the exception. Otherwise, the Manager returns the appropriate response, which can be '''None''', or it can be one or more Resource objects.
+
The internal design of the OpenStack Python SDK is based on the [http://en.wikipedia.org/wiki/OSI_model OSI Model] where the application is the resource object. The objects are described in more detail below.
 +
[[File:OpenStack_Python_SDK_Stack.png|none|center|OpenStack Python SDK Stack]]
  
 
==== Resource ====
 
==== Resource ====
 
The '''Resource''' class represents a resource in the cloud, such as a compute instance, a stored object, a network, etc. Rather than have fixed attributes, its attributes should be populated with the information returned from the API. Every resource should have an '''id''' attribute; in the cases where there is not a native id, such as a stored object in Swift, an 'id' property should be created to return the unique identifier for the resource, such as a name.
 
The '''Resource''' class represents a resource in the cloud, such as a compute instance, a stored object, a network, etc. Rather than have fixed attributes, its attributes should be populated with the information returned from the API. Every resource should have an '''id''' attribute; in the cases where there is not a native id, such as a stored object in Swift, an 'id' property should be created to return the unique identifier for the resource, such as a name.
  
==== HTTP ====
+
==== Transport ====
The '''HTTP''' class handled all communication between the local system and the API server. This functionality is separated out in order to make testing simpler, so that it can be replaced with a local API 'server' that acts as a test double. It adds any headers required, such as those required for authentication, getting that information from the Identity object.
+
For each service there is a single '''Client''' class that contains the interface that the application developer will work with. Any functionality in the SDK should be available as a method in the Client class. Each Client instance has a reference to an instance of its Manager class. There is no logic in the Client class except to pass the request to its manager, and return the result from the manager to the application.
 
 
 
 
== Common Methods ==
 
 
 
The base Client class should have methods that correspond to the most common actions across all the service APIs:
 
 
 
* <code>client.get(id)</code> - Returns the resource corresponding to the specified ID.
 
* <code>client.list(pagination_params)</code> - Returns a list of zero or more resources, optionally limited by pagination parameters.
 
* <code>client.update(resource_or_id, keyword1=value1, keyword2=value2, ...)</code> - Updates the specified resource with the named values.
 
* <code>client.create(list_of_values)</code> - Creates a new resource. The values required will vary between services.
 
* <code>client.delete(resource_or_id)</code> - Deletes the specified resource.
 
  
== Flexibility ==
+
== General Design Principles ==
  
 
* Whenever possible, equivalent parameters should be accepted. E.g., when acting on a resource, the user should be able to either supply the ID of that resource, or an instance on the Resource class corresponding to that resource.
 
* Whenever possible, equivalent parameters should be accepted. E.g., when acting on a resource, the user should be able to either supply the ID of that resource, or an instance on the Resource class corresponding to that resource.

Revision as of 02:42, 30 April 2014

Design

The intention of this document is to give a high level picture of the design of the OpenStack Python SDK. This document should cover how the SDK appears from the user perspective and important details of the internal design that the average user should not need to worry about.

User Interface Design

=Internal Design

Authenticator

Connection

The internal design of the OpenStack Python SDK is based on the OSI Model where the application is the resource object. The objects are described in more detail below.

OpenStack Python SDK Stack

Resource

The Resource class represents a resource in the cloud, such as a compute instance, a stored object, a network, etc. Rather than have fixed attributes, its attributes should be populated with the information returned from the API. Every resource should have an id attribute; in the cases where there is not a native id, such as a stored object in Swift, an 'id' property should be created to return the unique identifier for the resource, such as a name.

Transport

For each service there is a single Client class that contains the interface that the application developer will work with. Any functionality in the SDK should be available as a method in the Client class. Each Client instance has a reference to an instance of its Manager class. There is no logic in the Client class except to pass the request to its manager, and return the result from the manager to the application.

General Design Principles

  • Whenever possible, equivalent parameters should be accepted. E.g., when acting on a resource, the user should be able to either supply the ID of that resource, or an instance on the Resource class corresponding to that resource.
  • While the Client class is the interface to the developer using this SDK in their applications, there is one exception for convenience: Resource objects may be interacted with directly where appropriate. In general any time you have a method that looks like:
   client.some_method(resource)

you should be able to work directly with the resource:

   resource.some_method()

For example, if you have a reference server to a compute resource, wish to delete a compute resource, you could call either compute_client.delete(server), or server.delete(), and they would both result in the same action.