From 1eb3f584dc922cac9883f0eac6c2d0070ec4fc1a Mon Sep 17 00:00:00 2001 From: Olena Logvinova Date: Mon, 2 Mar 2015 20:10:36 +0200 Subject: [PATCH] Glance basic architecture section Adds a basic architecture description section to the Glance Developer guide. Change-Id: I782490bb8757cd67d83057176f8e3eeffa007b84 Co-Authored-By: Mike Fedosin Co-Authored-By: Olena Logvinova Co-Authored-By: Alexander Adamov --- doc/source/architecture.rst | 58 ++ doc/source/images/architecture.png | Bin 0 -> 53239 bytes doc/source/images_src/architecture.graphml | 931 +++++++++++++++++++++ doc/source/index.rst | 5 +- 4 files changed, 992 insertions(+), 2 deletions(-) create mode 100644 doc/source/architecture.rst create mode 100644 doc/source/images/architecture.png create mode 100644 doc/source/images_src/architecture.graphml diff --git a/doc/source/architecture.rst b/doc/source/architecture.rst new file mode 100644 index 0000000000..880b921ab8 --- /dev/null +++ b/doc/source/architecture.rst @@ -0,0 +1,58 @@ +.. + Copyright 2015 OpenStack Foundation + All Rights Reserved. + + Licensed 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. + +================== +Basic architecture +================== + +OpenStack Glance has a client-server architecture and provides a user +REST API through which requests to the server are performed. + +Internal server operations are managed by a Glance Domain Controller +divided into layers. Each layer implements its own task. + +All the files operations are performed using glance_store library +which is responsible for interaction with external storage back ends or +local filesystem, and provides a uniform interface to access. + +Glance uses an sql-based central database (Glance DB) that is shared +with all the components in the system. + +.. figure:: /images/architecture.png + :figwidth: 100% + :align: center + :alt: OpenStack Glance Architecture + +.. centered:: Image 1. OpenStack Glance Architecture + +The Glance architecture consists of several components: + +* **A client** — any application that uses Glance server. + +* **REST API** — exposes Glance functionality via REST. + +* **Database Abstraction Layer (DAL)** — an application programming interface + which unifies the communication between Glance and databases. + +* **Glance Domain Controller** — middleware that implements the main + Glance functionalities: authorization, notifications, policies, + database connections. + +* **Glance Store** — organizes interactions between Glance and various + data stores. + +* **Registry Layer** — optional layer organizing secure communication between + the domain and the DAL by using a seperate service. diff --git a/doc/source/images/architecture.png b/doc/source/images/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..2eacef98ac0a8ce76aca5129a5166c85187f2e08 GIT binary patch literal 53239 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�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 literal 0 HcmV?d00001 diff --git a/doc/source/images_src/architecture.graphml b/doc/source/images_src/architecture.graphml new file mode 100644 index 0000000000..ae84dbdce2 --- /dev/null +++ b/doc/source/images_src/architecture.graphml @@ -0,0 +1,931 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Keystone + + + + + + + + + + Folder 2 + + + + + + + + + + + + + + + + API + + + + + + + + + + + + + + + + + + + + + + Glance + + + + + + + + + + Folder 3 + + + + + + + + + + + + + + + + REST API + + + + + + + + + + + + + + + + + Glance DB + + + + + + + + + + + + + + + + + + + + Database +Abstraction +Layer + + + + + + + + + + + + + + + + + Glance +Domain +Controller + Auth +Notifier +Policy +Quota +Location +DB + + + + + + + + + + + + + + + + + + + AuthZ + + + + + + + + + + + + + + + + + Registry +Layer + + + + + + + + + + + + + + + + + + + + + + Glance Store + + + + + + + + + + Folder 4 + + + + + + + + + + + + + + + + Glance Store Drivers + + + + + + + + + + + + + + + + + + AuthN/AuthZ + + + + + + + + + + + + + + + + + + + + + + Supported Storages + + + + + + + + + + Folder 5 + + + + + + + + + + + + + + + + Swift + + + + + + + + + + + + + + + + + + + + S3 + + + + + + + + + + + + + + + + + + + + Ceph + + + + + + + + + + + + + + + + + + + + Sheepdog + + + + + + + + + + + + + + + + + + + + ... + + + + + + + + + + + + + + + + + + + + Filesystem + + + + + + + + + + + + + + + + + + + + + + + + + A client + + + + + + + + + + Folder 7 + + + + + + + + + + + + + + + + AuthN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <?xml version="1.0" encoding="utf-8"?> +<svg version="1.1" + xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" + x="0px" y="0px" width="40px" height="48px" viewBox="0 0 40 48" enable-background="new 0 0 40 48" xml:space="preserve"> +<defs> +</defs> +<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="370.2002" y1="655.0938" x2="409.4502" y2="655.0938" gradientTransform="matrix(1 0 0 1 -370.2002 -614.5742)"> + <stop offset="0" style="stop-color:#4D4D4D"/> + <stop offset="0.0558" style="stop-color:#5F5F5F"/> + <stop offset="0.2103" style="stop-color:#8D8D8D"/> + <stop offset="0.3479" style="stop-color:#AEAEAE"/> + <stop offset="0.4623" style="stop-color:#C2C2C2"/> + <stop offset="0.5394" style="stop-color:#C9C9C9"/> + <stop offset="0.6247" style="stop-color:#C5C5C5"/> + <stop offset="0.7072" style="stop-color:#BABABA"/> + <stop offset="0.7885" style="stop-color:#A6A6A6"/> + <stop offset="0.869" style="stop-color:#8B8B8B"/> + <stop offset="0.9484" style="stop-color:#686868"/> + <stop offset="1" style="stop-color:#4D4D4D"/> +</linearGradient> +<path fill="url(#SVGID_1_)" d="M19.625,37.613C8.787,37.613,0,35.738,0,33.425v10c0,2.313,8.787,4.188,19.625,4.188 + c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,35.738,30.464,37.613,19.625,37.613z"/> +<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="370.2002" y1="649.0938" x2="409.4502" y2="649.0938" gradientTransform="matrix(1 0 0 1 -370.2002 -614.5742)"> + <stop offset="0" style="stop-color:#B3B3B3"/> + <stop offset="0.0171" style="stop-color:#B6B6B6"/> + <stop offset="0.235" style="stop-color:#D7D7D7"/> + <stop offset="0.4168" style="stop-color:#EBEBEB"/> + <stop offset="0.5394" style="stop-color:#F2F2F2"/> + <stop offset="0.6579" style="stop-color:#EEEEEE"/> + <stop offset="0.7724" style="stop-color:#E3E3E3"/> + <stop offset="0.8853" style="stop-color:#CFCFCF"/> + <stop offset="0.9965" style="stop-color:#B4B4B4"/> + <stop offset="1" style="stop-color:#B3B3B3"/> +</linearGradient> +<path fill="url(#SVGID_2_)" d="M19.625,37.613c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.927-18.396,3.927 + c-9.481,0-17.396-1.959-18.396-3.927l-1.229,2C0,35.738,8.787,37.613,19.625,37.613z"/> +<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="371.4297" y1="646" x2="408.2217" y2="646" gradientTransform="matrix(1 0 0 1 -370.2002 -614.5742)"> + <stop offset="0" style="stop-color:#C9C9C9"/> + <stop offset="1" style="stop-color:#808080"/> +</linearGradient> +<ellipse fill="url(#SVGID_3_)" cx="19.625" cy="31.425" rx="18.396" ry="3.926"/> +<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="370.2002" y1="641.0938" x2="409.4502" y2="641.0938" gradientTransform="matrix(1 0 0 1 -370.2002 -614.5742)"> + <stop offset="0" style="stop-color:#4D4D4D"/> + <stop offset="0.0558" style="stop-color:#5F5F5F"/> + <stop offset="0.2103" style="stop-color:#8D8D8D"/> + <stop offset="0.3479" style="stop-color:#AEAEAE"/> + <stop offset="0.4623" style="stop-color:#C2C2C2"/> + <stop offset="0.5394" style="stop-color:#C9C9C9"/> + <stop offset="0.6247" style="stop-color:#C5C5C5"/> + <stop offset="0.7072" style="stop-color:#BABABA"/> + <stop offset="0.7885" style="stop-color:#A6A6A6"/> + <stop offset="0.869" style="stop-color:#8B8B8B"/> + <stop offset="0.9484" style="stop-color:#686868"/> + <stop offset="1" style="stop-color:#4D4D4D"/> +</linearGradient> +<path fill="url(#SVGID_4_)" d="M19.625,23.613C8.787,23.613,0,21.738,0,19.425v10c0,2.313,8.787,4.188,19.625,4.188 + c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,21.738,30.464,23.613,19.625,23.613z"/> +<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="370.2002" y1="635.0938" x2="409.4502" y2="635.0938" gradientTransform="matrix(1 0 0 1 -370.2002 -614.5742)"> + <stop offset="0" style="stop-color:#B3B3B3"/> + <stop offset="0.0171" style="stop-color:#B6B6B6"/> + <stop offset="0.235" style="stop-color:#D7D7D7"/> + <stop offset="0.4168" style="stop-color:#EBEBEB"/> + <stop offset="0.5394" style="stop-color:#F2F2F2"/> + <stop offset="0.6579" style="stop-color:#EEEEEE"/> + <stop offset="0.7724" style="stop-color:#E3E3E3"/> + <stop offset="0.8853" style="stop-color:#CFCFCF"/> + <stop offset="0.9965" style="stop-color:#B4B4B4"/> + <stop offset="1" style="stop-color:#B3B3B3"/> +</linearGradient> +<path fill="url(#SVGID_5_)" d="M19.625,23.613c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926 + c-9.481,0-17.396-1.959-18.396-3.926l-1.229,2C0,21.738,8.787,23.613,19.625,23.613z"/> +<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="371.4297" y1="632" x2="408.2217" y2="632" gradientTransform="matrix(1 0 0 1 -370.2002 -614.5742)"> + <stop offset="0" style="stop-color:#C9C9C9"/> + <stop offset="1" style="stop-color:#808080"/> +</linearGradient> +<ellipse fill="url(#SVGID_6_)" cx="19.625" cy="17.426" rx="18.396" ry="3.926"/> +<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="370.2002" y1="627.5938" x2="409.4502" y2="627.5938" gradientTransform="matrix(1 0 0 1 -370.2002 -614.5742)"> + <stop offset="0" style="stop-color:#4D4D4D"/> + <stop offset="0.0558" style="stop-color:#5F5F5F"/> + <stop offset="0.2103" style="stop-color:#8D8D8D"/> + <stop offset="0.3479" style="stop-color:#AEAEAE"/> + <stop offset="0.4623" style="stop-color:#C2C2C2"/> + <stop offset="0.5394" style="stop-color:#C9C9C9"/> + <stop offset="0.6247" style="stop-color:#C5C5C5"/> + <stop offset="0.7072" style="stop-color:#BABABA"/> + <stop offset="0.7885" style="stop-color:#A6A6A6"/> + <stop offset="0.869" style="stop-color:#8B8B8B"/> + <stop offset="0.9484" style="stop-color:#686868"/> + <stop offset="1" style="stop-color:#4D4D4D"/> +</linearGradient> +<path fill="url(#SVGID_7_)" d="M19.625,10.113C8.787,10.113,0,8.238,0,5.925v10c0,2.313,8.787,4.188,19.625,4.188 + c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,8.238,30.464,10.113,19.625,10.113z"/> +<linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="370.2002" y1="621.5938" x2="409.4502" y2="621.5938" gradientTransform="matrix(1 0 0 1 -370.2002 -614.5742)"> + <stop offset="0" style="stop-color:#B3B3B3"/> + <stop offset="0.0171" style="stop-color:#B6B6B6"/> + <stop offset="0.235" style="stop-color:#D7D7D7"/> + <stop offset="0.4168" style="stop-color:#EBEBEB"/> + <stop offset="0.5394" style="stop-color:#F2F2F2"/> + <stop offset="0.6579" style="stop-color:#EEEEEE"/> + <stop offset="0.7724" style="stop-color:#E3E3E3"/> + <stop offset="0.8853" style="stop-color:#CFCFCF"/> + <stop offset="0.9965" style="stop-color:#B4B4B4"/> + <stop offset="1" style="stop-color:#B3B3B3"/> +</linearGradient> +<path fill="url(#SVGID_8_)" d="M19.625,10.113c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926 + c-9.481,0-17.396-1.959-18.396-3.926L0,5.925C0,8.238,8.787,10.113,19.625,10.113z"/> +<linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="371.4297" y1="618.5" x2="408.2217" y2="618.5" gradientTransform="matrix(1 0 0 1 -370.2002 -614.5742)"> + <stop offset="0" style="stop-color:#C9C9C9"/> + <stop offset="1" style="stop-color:#808080"/> +</linearGradient> +<ellipse fill="url(#SVGID_9_)" cx="19.625" cy="3.926" rx="18.396" ry="3.926"/> +<path opacity="0.24" fill="#FFFFFF" enable-background="new " d="M31.291,46.792c0,0-4.313,0.578-7.249,0.694 + C20.917,47.613,15,47.613,15,47.613l-2.443-10.279l-0.119-2.283l-1.231-1.842L9.789,23.024l-0.082-0.119L9.3,20.715l-1.45-1.44 + L5.329,8.793c0,0,5.296,0.882,7.234,1.07s8.375,0.25,8.375,0.25l3,9.875l-0.25,1.313l1.063,2.168l2.312,9.644l-0.375,1.875 + l1.627,2.193L31.291,46.792z"/> +</svg> + + <?xml version="1.0" encoding="utf-8"?> +<svg version="1.1" + xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" + x="0px" y="0px" width="41px" height="48px" viewBox="-0.875 -0.887 41 48" enable-background="new -0.875 -0.887 41 48" + xml:space="preserve"> +<defs> +</defs> +<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-979.1445" x2="682.0508" y2="-979.1445" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#3C89C9"/> + <stop offset="0.1482" style="stop-color:#60A6DD"/> + <stop offset="0.3113" style="stop-color:#81C1F0"/> + <stop offset="0.4476" style="stop-color:#95D1FB"/> + <stop offset="0.5394" style="stop-color:#9CD7FF"/> + <stop offset="0.636" style="stop-color:#98D4FD"/> + <stop offset="0.7293" style="stop-color:#8DCAF6"/> + <stop offset="0.8214" style="stop-color:#79BBEB"/> + <stop offset="0.912" style="stop-color:#5EA5DC"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_1_)" d="M19.625,36.763C8.787,36.763,0,34.888,0,32.575v10c0,2.313,8.787,4.188,19.625,4.188 + c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,34.888,30.464,36.763,19.625,36.763z"/> +<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-973.1445" x2="682.0508" y2="-973.1445" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="0.0039" style="stop-color:#9DD7FF"/> + <stop offset="0.2273" style="stop-color:#BDE5FF"/> + <stop offset="0.4138" style="stop-color:#D1EEFF"/> + <stop offset="0.5394" style="stop-color:#D9F1FF"/> + <stop offset="0.6155" style="stop-color:#D5EFFE"/> + <stop offset="0.6891" style="stop-color:#C9E7FA"/> + <stop offset="0.7617" style="stop-color:#B6DAF3"/> + <stop offset="0.8337" style="stop-color:#9AC8EA"/> + <stop offset="0.9052" style="stop-color:#77B0DD"/> + <stop offset="0.9754" style="stop-color:#4D94CF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_2_)" d="M19.625,36.763c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.927-18.396,3.927 + c-9.481,0-17.396-1.959-18.396-3.927l-1.229,2C0,34.888,8.787,36.763,19.625,36.763z"/> +<path fill="#3C89C9" d="M19.625,26.468c10.16,0,19.625,2.775,19.625,2.775c-0.375,2.721-5.367,5.438-19.554,5.438 + c-12.125,0-18.467-2.484-19.541-4.918C-0.127,29.125,9.465,26.468,19.625,26.468z"/> +<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-965.6948" x2="682.0508" y2="-965.6948" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#3C89C9"/> + <stop offset="0.1482" style="stop-color:#60A6DD"/> + <stop offset="0.3113" style="stop-color:#81C1F0"/> + <stop offset="0.4476" style="stop-color:#95D1FB"/> + <stop offset="0.5394" style="stop-color:#9CD7FF"/> + <stop offset="0.636" style="stop-color:#98D4FD"/> + <stop offset="0.7293" style="stop-color:#8DCAF6"/> + <stop offset="0.8214" style="stop-color:#79BBEB"/> + <stop offset="0.912" style="stop-color:#5EA5DC"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_3_)" d="M19.625,23.313C8.787,23.313,0,21.438,0,19.125v10c0,2.313,8.787,4.188,19.625,4.188 + c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,21.438,30.464,23.313,19.625,23.313z"/> +<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-959.6948" x2="682.0508" y2="-959.6948" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="0.0039" style="stop-color:#9DD7FF"/> + <stop offset="0.2273" style="stop-color:#BDE5FF"/> + <stop offset="0.4138" style="stop-color:#D1EEFF"/> + <stop offset="0.5394" style="stop-color:#D9F1FF"/> + <stop offset="0.6155" style="stop-color:#D5EFFE"/> + <stop offset="0.6891" style="stop-color:#C9E7FA"/> + <stop offset="0.7617" style="stop-color:#B6DAF3"/> + <stop offset="0.8337" style="stop-color:#9AC8EA"/> + <stop offset="0.9052" style="stop-color:#77B0DD"/> + <stop offset="0.9754" style="stop-color:#4D94CF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_4_)" d="M19.625,23.313c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926 + c-9.481,0-17.396-1.959-18.396-3.926l-1.229,2C0,21.438,8.787,23.313,19.625,23.313z"/> +<path fill="#3C89C9" d="M19.476,13.019c10.161,0,19.625,2.775,19.625,2.775c-0.375,2.721-5.367,5.438-19.555,5.438 + c-12.125,0-18.467-2.485-19.541-4.918C-0.277,15.674,9.316,13.019,19.476,13.019z"/> +<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-952.4946" x2="682.0508" y2="-952.4946" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#3C89C9"/> + <stop offset="0.1482" style="stop-color:#60A6DD"/> + <stop offset="0.3113" style="stop-color:#81C1F0"/> + <stop offset="0.4476" style="stop-color:#95D1FB"/> + <stop offset="0.5394" style="stop-color:#9CD7FF"/> + <stop offset="0.636" style="stop-color:#98D4FD"/> + <stop offset="0.7293" style="stop-color:#8DCAF6"/> + <stop offset="0.8214" style="stop-color:#79BBEB"/> + <stop offset="0.912" style="stop-color:#5EA5DC"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_5_)" d="M19.625,10.113C8.787,10.113,0,8.238,0,5.925v10c0,2.313,8.787,4.188,19.625,4.188 + c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,8.238,30.464,10.113,19.625,10.113z"/> +<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-946.4946" x2="682.0508" y2="-946.4946" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="0.0039" style="stop-color:#9DD7FF"/> + <stop offset="0.2273" style="stop-color:#BDE5FF"/> + <stop offset="0.4138" style="stop-color:#D1EEFF"/> + <stop offset="0.5394" style="stop-color:#D9F1FF"/> + <stop offset="0.6155" style="stop-color:#D5EFFE"/> + <stop offset="0.6891" style="stop-color:#C9E7FA"/> + <stop offset="0.7617" style="stop-color:#B6DAF3"/> + <stop offset="0.8337" style="stop-color:#9AC8EA"/> + <stop offset="0.9052" style="stop-color:#77B0DD"/> + <stop offset="0.9754" style="stop-color:#4D94CF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<path fill="url(#SVGID_6_)" d="M19.625,10.113c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926 + c-9.481,0-17.396-1.959-18.396-3.926L0,5.925C0,8.238,8.787,10.113,19.625,10.113z"/> +<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="644.0293" y1="-943.4014" x2="680.8223" y2="-943.4014" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"> + <stop offset="0" style="stop-color:#9CD7FF"/> + <stop offset="1" style="stop-color:#3C89C9"/> +</linearGradient> +<ellipse fill="url(#SVGID_7_)" cx="19.625" cy="3.926" rx="18.396" ry="3.926"/> +<path opacity="0.24" fill="#FFFFFF" enable-background="new " d="M31.04,45.982c0,0-4.354,0.664-7.29,0.781 + c-3.125,0.125-8.952,0-8.952,0l-2.384-10.292l0.044-2.108l-1.251-1.154L9.789,23.024l-0.082-0.119L9.5,20.529l-1.65-1.254 + L5.329,8.793c0,0,4.213,0.903,7.234,1.07s8.375,0.25,8.375,0.25l3,9.875l-0.25,1.313l1.063,2.168l2.312,9.645l-0.521,1.416 + l1.46,1.834L31.04,45.982z"/> +</svg> + + + + diff --git a/doc/source/index.rst b/doc/source/index.rst index 283a9033f0..37aabace98 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -44,12 +44,13 @@ be found on the `OpenStack wiki`_. .. _`OpenStack wiki`: http://wiki.openstack.org -Concepts -======== +Glance Background Concepts +========================== .. toctree:: :maxdepth: 1 + architecture identifiers statuses formats