From 3342a09ba76934e65ec1f3f044a39d5b16e2cbe2 Mon Sep 17 00:00:00 2001 From: Olena Logvinova Date: Fri, 18 Dec 2015 18:19:56 +0200 Subject: [PATCH] [docs] Add Domain model implementation sub-section This patch adds a new Glance domain model implementation sub-section to the Glance Background Concepts section. Change-Id: I74a4923f2ba1a52cfd2d9ac42a8571619ef0882a Co-Authored-By: Darja Shakhray Co-Authored-By: Olena Logvinova --- doc/source/domain_implementation.rst | 134 ++++++++ doc/source/images/glance_layers.png | Bin 0 -> 32606 bytes doc/source/images_src/glance_layers.graphml | 363 ++++++++++++++++++++ doc/source/index.rst | 1 + 4 files changed, 498 insertions(+) create mode 100644 doc/source/domain_implementation.rst create mode 100644 doc/source/images/glance_layers.png create mode 100644 doc/source/images_src/glance_layers.graphml diff --git a/doc/source/domain_implementation.rst b/doc/source/domain_implementation.rst new file mode 100644 index 00000000..a026d2ff --- /dev/null +++ b/doc/source/domain_implementation.rst @@ -0,0 +1,134 @@ +.. + Copyright 2016 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. + +================================== +Glance domain model implementation +================================== + +Gateway and basic layers +~~~~~~~~~~~~~~~~~~~~~~~~ + +The domain model contains the following layers: + +#. :ref:`authorization` +#. :ref:`notifier` +#. :ref:`property` +#. :ref:`policy` +#. :ref:`quota` +#. :ref:`location` +#. :ref:`database` + +The schema below shows a stack that contains the Image domain layers and +their locations: + +.. figure:: /images/glance_layers.png + :figwidth: 100% + :align: center + :alt: Image domain layers + +.. _authorization: + +Authorization +------------- + +The first layer of the domain model provides a verification of whether an +image itself or its property can be changed. An admin or image owner can +apply the changes. The information about a user is taken from the request +``context`` and is compared with the image ``owner``. If the user cannot +apply a change, a corresponding error message appears. + +.. _property: + +Property protection +------------------- + +The second layer of the domain model is optional. It becomes available if you +set the ``property_protection_file`` parameter in the Glance configuration +file. + +There are two types of image properties in Glance: + +* *Core properties*, as specified in the image schema +* *Meta properties*, which are the arbitrary key/value pairs that can be added + to an image + +The property protection layer manages access to the meta properties +through Glance’s public API calls. You can restrict the access in the +property protection configuration file. + +.. _notifier: + +Notifier +-------- + +On the third layer of the domain model, the following items are added to +the message queue: + +#. Notifications about all of the image changes +#. All of the exceptions and warnings that occurred while using an image + +.. _policy: + +Policy +------ + +The fourth layer of the domain model is responsible for: + +#. Defining access rules to perform actions with an image. The rules are + defined in the :file:`etc/policy.json` file. +#. Monitoring of the rules implementation. + +.. _quota: + +Quota +----- + +On the fifth layer of the domain model, if a user has an admin-defined size +quota for all of his uploaded images, there is a check that verifies whether +this quota exceeds the limit during an image upload and save: + +* If the quota does not exceed the limit, then the action to add an image + succeeds. +* If the quota exceeds the limit, then the action does not succeed and a + corresponding error message appears. + +.. _location: + +Location +-------- + +The sixth layer of the domain model is used for interaction with the store via +the ``glance_store`` library, like upload and download, and for managing an +image location. On this layer, an image is validated before the upload. If +the validation succeeds, an image is written to the ``glance_store`` library. + +This sixth layer of the domain model is responsible for: + +#. Checking whether a location URI is correct when a new location is added +#. Removing image data from the store when an image location is changed +#. Preventing image location duplicates + +.. _database: + +Database +-------- + +On the seventh layer of the domain model: + +* The methods to interact with the database API are implemented. +* Images are converted to the corresponding format to be recorded in the + database. And the information received from the database is + converted to an Image object. diff --git a/doc/source/images/glance_layers.png b/doc/source/images/glance_layers.png new file mode 100644 index 0000000000000000000000000000000000000000..783737d8dfcb4f61f78a12dac7ae8fc5f0a3b76e GIT binary patch literal 32606 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 + + + + + + + + + + + + + + + + + + + + + + Domain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Router +api/v2/router.py + + + + + + + + + + + + + + + + + + + REST API +api/v2/* + + + + + + + + + + + + + + + + + + + Auth +api/authorization.py + + + + + + + + + + + + + + + + + + + Notifier +notifier.py + + + + + + + + + + + + + + + + + + + Policy +api/policy.py + + + + + + + + + + + + + + + + + + + Quota +quota/__init__.py + + + + + + + + + + + + + + + + + + + Location +location.py + + + + + + + + + + + + + + + + + + + DB +db/__init__.py + + + + + + + + + + + + + + + + + + + Registry (optional) +registry/v2/* + + + + + + + + + + + + + + + + + + + Data Access +db/sqlalchemy/api.py + + + + + + + + + + + + + + + + + + + A Client + + + + + + + + + + + + + + + + + + + Glance Store + + + + + + + + + + + + + + + + + + + DBMS + + + + + + + + + + + + + + + + + + + Property protection (optional) +api/property_protections.py + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/source/index.rst b/doc/source/index.rst index 5a0092f1..ef912c71 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -53,6 +53,7 @@ Glance Background Concepts architecture database_architecture domain_model + domain_implementation identifiers statuses tasks