Link
¶A link representation.
Data samples:
{
"href": "http://example.com:9777/v1",
"target_name": "v1"
}
<value>
<href>http://example.com:9777/v1</href>
<target_name>v1</target_name>
</value>
href
¶Type: | unicode |
---|
The link URI.
target_name
¶Type: | unicode |
---|
Textual name of the target link.
Platform
¶Representation of a Platform.
The Platform resource is the root level resource that refers to all the other resources owned by this tenant.
Data samples:
{
"assemblies_uri": "http://example.com:9777/v1/assemblies",
"components_uri": "http://example.com:9777/v1/components",
"description": "solum native implementation",
"extensions_uri": "http://example.com:9777/v1/extensions",
"implementation_version": "2014.1.1",
"infrastructure_uri": "http://example.com:9777/v1/infrastructure",
"language_packs_uri": "http://example.com:9777/v1/language_packs",
"name": "solum",
"operations_uri": "http://example.com:9777/v1/operations",
"pipelines_uri": "http://example.com:9777/v1/pipelines",
"plans_uri": "http://example.com:9777/v1/plans",
"project_id": "1dae5a09ef2b4d8cbf3594b0eb4f6b94",
"sensors_uri": "http://example.com:9777/v1/sensors",
"services_uri": "http://example.com:9777/v1/services",
"tags": [
"solid"
],
"triggers_uri": "http://example.com:9777/v1/triggers",
"type": "platform",
"uri": "http://example.com/v1",
"user_id": "55f41cf46df74320b9486a35f5d28a11"
}
<value>
<implementation_version>2014.1.1</implementation_version>
<plans_uri>http://example.com:9777/v1/plans</plans_uri>
<assemblies_uri>http://example.com:9777/v1/assemblies</assemblies_uri>
<services_uri>http://example.com:9777/v1/services</services_uri>
<components_uri>http://example.com:9777/v1/components</components_uri>
<extensions_uri>http://example.com:9777/v1/extensions</extensions_uri>
<operations_uri>http://example.com:9777/v1/operations</operations_uri>
<sensors_uri>http://example.com:9777/v1/sensors</sensors_uri>
<language_packs_uri>http://example.com:9777/v1/language_packs</language_packs_uri>
<pipelines_uri>http://example.com:9777/v1/pipelines</pipelines_uri>
<triggers_uri>http://example.com:9777/v1/triggers</triggers_uri>
<infrastructure_uri>http://example.com:9777/v1/infrastructure</infrastructure_uri>
<name>solum</name>
<type>platform</type>
<tags>
<item>solid</item>
</tags>
<project_id>1dae5a09ef2b4d8cbf3594b0eb4f6b94</project_id>
<user_id>55f41cf46df74320b9486a35f5d28a11</user_id>
<description>solum native implementation</description>
<uri>http://example.com/v1</uri>
</value>
assemblies_uri
¶Type: | unicode |
---|
URI to assemblies.
components_uri
¶Type: | unicode |
---|
URI to components.
extensions_uri
¶Type: | unicode |
---|
URI to extensions.
implementation_version
¶Type: | unicode |
---|
Version of the platform.
infrastructure_uri
¶Type: | unicode |
---|
URI to infrastructure.
language_packs_uri
¶Type: | unicode |
---|
URI to language packs.
operations_uri
¶Type: | unicode |
---|
URI to operations.
pipelines_uri
¶Type: | unicode |
---|
URI to pipelines.
plans_uri
¶Type: | unicode |
---|
URI to plans.
sensors_uri
¶Type: | unicode |
---|
URI to sensors.
services_uri
¶Type: | unicode |
---|
URI to services.
triggers_uri
¶Type: | unicode |
---|
URI to triggers.
Plan
¶Representation of an Plan file.
The Plan resource is a representation of a Plan file. Plans are used to create Assembly resources. A Plan resource may be used to create an arbitrary number of Assembly instances. They use artifacts and services to indicate what will be used to generate the plan, and what services Solum can use to satisfy them. Note: Plan files are YAML and Plan resources are the REST representation of the Plan file after services have been matched to ones offered by Solum.
Data samples:
{
"artifacts": [
{
"artifact_type": "git_pull",
"content": {
"href": "git://example.com/project.git",
"private": false
},
"language_pack": "30af19b6-dbe9-4394-afb4-c0b6efe358fa",
"name": "My-python-app",
"requirements": [
{
"fulfillment": "id:build",
"requirement_type": "git_pull"
}
]
}
],
"description": "A plan with no services or artifacts shown",
"name": "Example-plan",
"project_id": "1dae5a09ef2b4d8cbf3594b0eb4f6b94",
"services": [
{
"characteristics": [
"python_build_service"
],
"id": "build",
"name": "Build-Service"
}
],
"tags": [
"small"
],
"trigger_uri": "http://example.com/v1/triggers/1abc234",
"type": "plan",
"uri": "http://example.com/v1/plans/x1",
"user_id": "55f41cf46df74320b9486a35f5d28a11"
}
<value>
<artifacts>
<item>
<name>My-python-app</name>
<artifact_type>git_pull</artifact_type>
<content>
<item>
<key>href</key>
<value>git://example.com/project.git</value>
</item>
<item>
<key>private</key>
<value>False</value>
</item>
</content>
<language_pack>30af19b6-dbe9-4394-afb4-c0b6efe358fa</language_pack>
<requirements>
<item>
<requirement_type>git_pull</requirement_type>
<fulfillment>id:build</fulfillment>
</item>
</requirements>
</item>
</artifacts>
<services>
<item>
<name>Build-Service</name>
<id>build</id>
<characteristics>
<item>python_build_service</item>
</characteristics>
</item>
</services>
<trigger_uri>http://example.com/v1/triggers/1abc234</trigger_uri>
<name>Example-plan</name>
<type>plan</type>
<tags>
<item>small</item>
</tags>
<project_id>1dae5a09ef2b4d8cbf3594b0eb4f6b94</project_id>
<user_id>55f41cf46df74320b9486a35f5d28a11</user_id>
<description>A plan with no services or artifacts shown</description>
<uri>http://example.com/v1/plans/x1</uri>
</value>
artifacts
¶Type: | list(Artifact) |
---|
List of artifacts defining the plan.
parameters
¶Type: | dict(unicode: None) |
---|
User defined parameters
services
¶Type: | list(ServiceReference) |
---|
List of services needed by the plan.
trigger_uri
¶Type: | unicode |
---|
The trigger uri used to trigger the build of the plan
Pipeline
¶Representation of an Pipeline.
A pipeline is the association between a plan, a mistral workbook and a git trigger. Together they form a working development “pipeline”.
Data samples:
{
"description": "A pipeline for my app",
"last_execution": "78f41cf46df7430b9486a35f5d28a41",
"name": "Example-pipeline",
"plan_uri": "http://example.com/v1/plans/x1",
"project_id": "1dae5a09ef2b4d8cbf3594b0eb4f6b94",
"tags": [
"small"
],
"trigger_uri": "http://example.com/v1/triggers/1abc234",
"type": "pipeline",
"uri": "http://example.com/v2/pipelines/p1",
"user_id": "55f41cf46df74320b9486a35f5d28a11",
"workbook_name": "build-deploy"
}
<value>
<plan_uri>http://example.com/v1/plans/x1</plan_uri>
<workbook_name>build-deploy</workbook_name>
<trigger_uri>http://example.com/v1/triggers/1abc234</trigger_uri>
<last_execution>78f41cf46df7430b9486a35f5d28a41</last_execution>
<type>pipeline</type>
<name>Example-pipeline</name>
<description>A pipeline for my app</description>
<tags>
<item>small</item>
</tags>
<project_id>1dae5a09ef2b4d8cbf3594b0eb4f6b94</project_id>
<user_id>55f41cf46df74320b9486a35f5d28a11</user_id>
<uri>http://example.com/v2/pipelines/p1</uri>
</value>
last_execution
¶Type: | unicode |
---|
The UUID of the last run execution.
plan_uri
¶Type: | unicode |
---|
Link to the plan URI.
trigger_uri
¶Type: | unicode |
---|
The trigger uri used to trigger the pipeline.
workbook_name
¶Type: | unicode |
---|
Name of the workbook in Mistral to use.
Execution
¶Data samples:
{
"href": "http://example.com:9777/v1",
"target_name": "v1"
}
<value>
<href>http://example.com:9777/v1</href>
<target_name>v1</target_name>
</value>
Assembly
¶Representation of an Assembly.
The Assembly resource represents a group of components that make up a running instance of an application. You may casually refer to this as “the application” but we refer to it as an Assembly because most cloud applications are actually a system of multiple service instances that make up a system. For example, a three-tier web application may have a load balancer component, a group of application servers, and a database server all represented as Component resources that make up an Assembly resource. An Assembly resource has at least one Component resource associated with it.
Data samples:
{
"components": [],
"created_at": "2019-03-25T09:11:29.730920",
"description": "A mysql database",
"name": "database",
"operations": [],
"plan_uri": "http://example.com/v1/plans/45-09",
"project_id": "1dae5a09ef2b4d8cbf3594b0eb4f6b94",
"sensors": [],
"tags": [
"small"
],
"type": "assembly",
"updated_at": "2019-03-25T09:11:29.730920",
"uri": "http://example.com/v1/assemblies/x4",
"user_id": "55f41cf46df74320b9486a35f5d28a11"
}
<value>
<plan_uri>http://example.com/v1/plans/45-09</plan_uri>
<components />
<operations />
<sensors />
<updated_at>2019-03-25T09:11:29.730920</updated_at>
<created_at>2019-03-25T09:11:29.730920</created_at>
<name>database</name>
<type>assembly</type>
<tags>
<item>small</item>
</tags>
<project_id>1dae5a09ef2b4d8cbf3594b0eb4f6b94</project_id>
<user_id>55f41cf46df74320b9486a35f5d28a11</user_id>
<description>A mysql database</description>
<uri>http://example.com/v1/assemblies/x4</uri>
</value>
application_uri
¶Type: | unicode |
---|
The uri of the deployed application.
components
¶Type: | list(Component) |
---|
Components that belong to the assembly.
created_at
¶Type: | datetime |
---|
The time the assembly initially created.
operations
¶Type: | list(Operation) |
---|
Operations that belong to the assembly.
plan_uri
¶Type: | unicode |
---|
The URI to the plan to be used to create this assembly.
sensors
¶Type: | list(Sensor) |
---|
Sensors that belong to the assembly.
status
¶Type: | unicode |
---|
The status of the assembly.
updated_at
¶Type: | datetime |
---|
The last time a change was made to the assembly’s status.
workflow
¶Type: | list(Enum(unittest, build, deploy)) |
---|
Defines the workflow that an assembly will go through.
Service
¶The Service resource represents a networked service.
You may create Component resources that refer to Service resources. A Component represents an instance of a Service. Your application connects to such a Component using a network protocol. For example, the Platform may offer a default Service named “mysql”. You may create multiple Component resources that reference different instances of the “mysql” service. Each Component may be a multi-tenant instance of a MySQL database (perhaps a logical database) service offered by the Platform for a given Assembly.
Data samples:
{
"description": "A language pack service",
"name": "language-pack",
"project_id": "1dae5a09ef2b4d8cbf3594b0eb4f6b94",
"read_only": false,
"service_type": "language_pack",
"tags": [
"group_xyz"
],
"type": "service",
"uri": "http://example.com/v1/language_packs/java1.4",
"user_id": "55f41cf46df74320b9486a35f5d28a11"
}
<value>
<read_only>false</read_only>
<service_type>language_pack</service_type>
<name>language-pack</name>
<type>service</type>
<description>A language pack service</description>
<project_id>1dae5a09ef2b4d8cbf3594b0eb4f6b94</project_id>
<user_id>55f41cf46df74320b9486a35f5d28a11</user_id>
<tags>
<item>group_xyz</item>
</tags>
<uri>http://example.com/v1/language_packs/java1.4</uri>
</value>
read_only
¶Type: | bool |
---|
The service is read only when this value is true.
service_type
¶Type: | unicode |
---|
Type of service. Example: language_pack or db::mysql
Operation
¶An Operation resource represents an operation or action.
This is for defining actions that may change the state of the resource they are related to. For example, the API already provides ways to register, start, and stop your application (POST an Assembly to register+start, and DELETE an Assembly to stop) but Operations provide a way to extend the system to add your own actions such as “pause” and “resume”, or “scale_up” and “scale_down”.
Data samples:
{
"description": "A resume operation",
"documentation": "http://example.com/docs/resume_op",
"name": "resume",
"project_id": "1dae5a09ef2b4d8cbf3594b0eb4f6b94",
"tags": [
"small"
],
"target_resource": "http://example.com/instances/uuid",
"type": "operation",
"uri": "http://example.com/v1/operations/resume",
"user_id": "55f41cf46df74320b9486a35f5d28a11"
}
<value>
<documentation>http://example.com/docs/resume_op</documentation>
<target_resource>http://example.com/instances/uuid</target_resource>
<name>resume</name>
<type>operation</type>
<tags>
<item>small</item>
</tags>
<project_id>1dae5a09ef2b4d8cbf3594b0eb4f6b94</project_id>
<user_id>55f41cf46df74320b9486a35f5d28a11</user_id>
<description>A resume operation</description>
<uri>http://example.com/v1/operations/resume</uri>
</value>
documentation
¶Type: | unicode |
---|
Documentation URI for the operation.
target_resource
¶Type: | unicode |
---|
Target resource URI to the operation.
Sensor
¶A Sensor resource represents exactly one supported sensor.
Sensor resources represent dynamic data about resources, such as metrics or state. Sensor resources are useful for exposing data that changes rapidly, or that may need to be fetched from a secondary system.
Data samples:
{
"description": "A heartbeat sensor",
"documentation": "http://example.com/docs/heartbeat/",
"name": "hb",
"operations": [],
"project_id": "1dae5a09ef2b4d8cbf3594b0eb4f6b94",
"sensor_type": "str",
"target_resource": "http://example.com/instances/uuid",
"timestamp": "2019-03-25T09:11:29.881295",
"type": "sensor",
"uri": "http://example.com/v1/sensors/hb",
"user_id": "55f41cf46df74320b9486a35f5d28a11",
"value": "30"
}
<value>
<documentation>http://example.com/docs/heartbeat/</documentation>
<target_resource>http://example.com/instances/uuid</target_resource>
<sensor_type>str</sensor_type>
<timestamp>2019-03-25T09:11:29.881295</timestamp>
<operations />
<value>30</value>
<name>hb</name>
<type>sensor</type>
<project_id>1dae5a09ef2b4d8cbf3594b0eb4f6b94</project_id>
<user_id>55f41cf46df74320b9486a35f5d28a11</user_id>
<description>A heartbeat sensor</description>
<uri>http://example.com/v1/sensors/hb</uri>
</value>
documentation
¶Type: | unicode |
---|
Documentation URI for the sensor.
operations
¶Type: | list(Operation) |
---|
Operations that belong to the sensor.
sensor_type
¶Type: | Enum(str, float, int) |
---|
Sensor data type.
target_resource
¶Type: | unicode |
---|
Target resource URI to the sensor.
timestamp
¶Type: | datetime |
---|
Timestamp for Sensor.
value
¶Type: | str |
---|
Value of the sensor.
Component
¶The Component resource represents one part of an Assembly.
For example, an instance of a database service may be a Component. A Component resource may also represent a static artifact, such as an archive file that contains data for initializing your application. An Assembly may have different components that represent different processes that run. For example, you may have one Component that represents an API service process, and another that represents a web UI process that consumes that API service. The simplest case is when an Assembly has only one component. For example, your component may be named “PHP” and refers to the PHP Service offered by the platform for running a PHP application.
Data samples:
{
"abbreviated": true,
"component_type": "heat_stack",
"components_ids": [],
"description": "A php web application component",
"heat_stack_id": "4c712026-dcd5-4664-90b8-0915494c1332",
"name": "php-web-app",
"operations": [],
"project_id": "1dae5a09ef2b4d8cbf3594b0eb4f6b94",
"sensors": [],
"services": [],
"tags": [
"group_xyz"
],
"type": "component",
"uri": "http://example.com/v1/components/php-web-app",
"user_id": "55f41cf46df74320b9486a35f5d28a11"
}
<value>
<services />
<operations />
<sensors />
<abbreviated>true</abbreviated>
<components_ids />
<component_type>heat_stack</component_type>
<heat_stack_id>4c712026-dcd5-4664-90b8-0915494c1332</heat_stack_id>
<name>php-web-app</name>
<type>component</type>
<description>A php web application component</description>
<tags>
<item>group_xyz</item>
</tags>
<project_id>1dae5a09ef2b4d8cbf3594b0eb4f6b94</project_id>
<user_id>55f41cf46df74320b9486a35f5d28a11</user_id>
<uri>http://example.com/v1/components/php-web-app</uri>
</value>
abbreviated
¶Type: | bool |
---|
Boolean value indicating if this components has nested components at more than one level of depth.
assembly_uuid
¶Type: | unicode |
---|
“The uuid of the assembly that this component belongs in.
component_type
¶Type: | unicode |
---|
Type of component e.g. heat_stack.
components_ids
¶Type: | list(unicode) |
---|
IDs of nested component of the component.
heat_stack_id
¶Type: | unicode |
---|
Unique identifier of the Heat Stack.
operations
¶Type: | list(Operation) |
---|
Operations that belong to the component.
plan_uri
¶Type: | unicode |
---|
URI of Plan of which the component is a part.
resource_uri
¶Type: | unicode |
---|
Remote resource URI of the component.
sensors
¶Type: | list(Sensor) |
---|
Sensors that belong to the component.
services
¶Type: | list(Service) |
---|
Services that belong to the component.
Extension
¶The Extension resource represents Provider modifications.
This may include additional protocol semantics, resource types, application lifecycle states, resource attributes, etc. Anything may be added, as long as it does not contradict the base functionality offered by Solum.
Data samples:
{
"description": "This logstash extension provides a tool for managing your application events and logs.",
"documentation": "http://example.com/docs/ext/logstash",
"name": "logstash",
"project_id": "1dae5a09ef2b4d8cbf3594b0eb4f6b94",
"tags": [
"large"
],
"type": "extension",
"uri": "http://example.com/v1/extensions/logstash",
"user_id": "55f41cf46df74320b9486a35f5d28a11",
"version": "2.13"
}
<value>
<version>2.13</version>
<documentation>http://example.com/docs/ext/logstash</documentation>
<name>logstash</name>
<type>extension</type>
<tags>
<item>large</item>
</tags>
<project_id>1dae5a09ef2b4d8cbf3594b0eb4f6b94</project_id>
<user_id>55f41cf46df74320b9486a35f5d28a11</user_id>
<description>This logstash extension provides a tool for managing your application events and logs.</description>
<uri>http://example.com/v1/extensions/logstash</uri>
</value>
documentation
¶Type: | unicode |
---|
Documentation URI to the extension.
version
¶Type: | unicode |
---|
Version of the extension.
LanguagePack
¶Representation of a language pack.
When a user creates an application, he specifies the language pack to be used. The language pack is responsible for building the application and producing an artifact for deployment.
For a complete list of language pack attributes please refer: https://etherpad.openstack.org/p/Solum-Language-pack-json-format
Data samples:
{
"attributes": {
"admin_email": "someadmin@somewhere.com",
"optional_attr1": "value"
},
"base_image_id": "4dae5a09ef2b4d8cbf3594b0eb4f6b94",
"build_tool_chain": [
{
"type": "ant",
"version": "1.7"
},
{
"type": "maven",
"version": "1.2"
}
],
"compiler_versions": [
"1.4",
"1.6",
"1.7"
],
"created_image_id": "4afasa09ef2b4d8cbf3594b0ec4f6b94",
"description": "A php web application",
"image_format": "docker",
"language_implementation": "Sun",
"language_pack_type": "org.openstack.solum.Java",
"name": "php-web-app",
"os_platform": {
"OS": "Ubuntu",
"version": "12.04"
},
"project_id": "1dae5a09ef2b4d8cbf3594b0eb4f6b94",
"runtime_versions": [
"1.4",
"1.6",
"1.7"
],
"source_format": "heroku",
"source_uri": "git://example.com/project/app.git",
"tags": [
"group_xyz"
],
"type": "languagepack",
"uri": "http://example.com/v1/images/b3e0d79",
"user_id": "55f41cf46df74320b9486a35f5d28a11"
}
<value>
<name>php-web-app</name>
<language_pack_type>org.openstack.solum.Java</language_pack_type>
<compiler_versions>
<item>1.4</item>
<item>1.6</item>
<item>1.7</item>
</compiler_versions>
<runtime_versions>
<item>1.4</item>
<item>1.6</item>
<item>1.7</item>
</runtime_versions>
<language_implementation>Sun</language_implementation>
<build_tool_chain>
<item>
<type>ant</type>
<version>1.7</version>
</item>
<item>
<type>maven</type>
<version>1.2</version>
</item>
</build_tool_chain>
<os_platform>
<item>
<key>version</key>
<value>12.04</value>
</item>
<item>
<key>OS</key>
<value>Ubuntu</value>
</item>
</os_platform>
<attributes>
<item>
<key>optional_attr1</key>
<value>value</value>
</item>
<item>
<key>admin_email</key>
<value>someadmin@somewhere.com</value>
</item>
</attributes>
<source_uri>git://example.com/project/app.git</source_uri>
<source_format>heroku</source_format>
<base_image_id>4dae5a09ef2b4d8cbf3594b0eb4f6b94</base_image_id>
<image_format>docker</image_format>
<created_image_id>4afasa09ef2b4d8cbf3594b0ec4f6b94</created_image_id>
<tags>
<item>group_xyz</item>
</tags>
<type>languagepack</type>
<description>A php web application</description>
<project_id>1dae5a09ef2b4d8cbf3594b0eb4f6b94</project_id>
<user_id>55f41cf46df74320b9486a35f5d28a11</user_id>
<uri>http://example.com/v1/images/b3e0d79</uri>
</value>
attributes
¶Type: | dict(str: unicode) |
---|
Additional section attributes will be used to expose custom attributes designed by language pack creator.
base_image_id
¶Type: | unicode |
---|
The id (in glance) of the image to customize.
build_tool_chain
¶Type: | list(BuildTool) |
---|
Toolchain available in the language pack. Example: For a java language pack which supports Ant and Maven, build_tool_chain = [“{type:ant,version:1.7}”,”{type:maven,version:1.2}”]
compiler_versions
¶Type: | list(unicode) |
---|
List of all the compiler versions supported by the language pack. Example: For a java language pack supporting Java versions 1.4 to 1.7, version = [‘1.4’, ‘1.6’, ‘1.7’]
created_image_id
¶Type: | unicode |
---|
The id of the created image in glance.
image_format
¶Type: | Enum(auto, qcow2, docker) |
---|
The image format.
language_implementation
¶Type: | unicode |
---|
Actual language implementation supported by the language pack. Example: In case of java it might be ‘Sun’ or ‘openJava’ In case of C++ it can be ‘gcc’ or ‘icc’ or ‘microsoft’.
language_pack_type
¶Type: | unicode |
---|
Type of the language pack. Identifies the language supported by the language pack. This attribute value will use the org.openstack.solum namespace.
lp_metadata
¶Type: | unicode |
---|
The languagepack meta data.
os_platform
¶Type: | dict(str: unicode) |
---|
OS and its version used by the language pack. This attribute identifies the base image of the language pack.
runtime_versions
¶Type: | list(unicode) |
---|
List of all runtime versions supported by the language pack. Runtime version can be different than compiler version. Example: An application can be compiled with java 1.7 but it should run in java 1.6 as it is backward compatible.
source_format
¶Type: | Enum(auto, heroku, dib, dockerfile) |
---|
The source repository format.
source_uri
¶Type: | unicode |
---|
The URI of the app/element.
status
¶Type: | Enum(BUILDING, READY, QUEUED, ERROR) |
---|
The state of the image.
Infrastructure
¶Description of an Infrastructure.
Data samples:
{
"description": "Solum Infrastructure endpoint",
"name": "infrastructure",
"project_id": "1dae5a09ef2b4d8cbf3594b0eb4f6b94",
"stacks_uri": "http://example.com/v1/infrastructure/stacks",
"tags": [
"small"
],
"type": "infrastructure",
"uri": "http://example.com/v1/infrastructure",
"user_id": "55f41cf46df74320b9486a35f5d28a11"
}
<value>
<stacks_uri>http://example.com/v1/infrastructure/stacks</stacks_uri>
<name>infrastructure</name>
<type>infrastructure</type>
<tags>
<item>small</item>
</tags>
<project_id>1dae5a09ef2b4d8cbf3594b0eb4f6b94</project_id>
<user_id>55f41cf46df74320b9486a35f5d28a11</user_id>
<description>Solum Infrastructure endpoint</description>
<uri>http://example.com/v1/infrastructure</uri>
</value>
stacks_uri
¶Type: | unicode |
---|
URI to services.
Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.