diff --git a/doc/source/dev/code-contribution-guide.rst b/doc/source/dev/code-contribution-guide.rst new file mode 100644 index 0000000000..5cbf69a28e --- /dev/null +++ b/doc/source/dev/code-contribution-guide.rst @@ -0,0 +1,56 @@ +.. _code-contribution-guide: + +================================== +Code Contribution Guide for Ironic +================================== + +This document provides some necessary points for developers to consider when +writing and reviewing Ironic code. The checklist will help developers get things +right. + +Live Upgrade Related Concerns +============================= +Ironic implements upgrade with the same methodology of Nova: + http://docs.openstack.org/developer/nova/upgrade.html + +Ironic API RPC Versions +----------------------- + +* When the signature(arguments) of an RPC method is changed, the following things + need to be considered: + + - Client-side (conductor/rpcapi.py) and server-side (conductor/manager.py) + should both increment the RPC version by one and the RPC versions must be the same of + the client and server. + - New arguments of the method can only be added as optional. Existing arguments cannot be + removed or changed in incompatible ways (with the method in older RPC versions). + - Client-side can pin a version cap by passing ``version_cap`` to the constructor + of oslo_messaging.RPCClient. Methods which change arguments should run + client.can_send_version() to see if the version of the request is compatible with the + version cap of RPC Client, otherwise the request needs to be created to work with a + previous version that is suppoted. + - Server-side should tolerate the older version of requests in order to keep + working during the progress of live upgrade. The behavior of server-side should + depend on the input parameters passed from the client-side. + +Object Versions +--------------- +* When Object classes (subclasses of ironic.objects.base.IronicObject) are modified, the + following things need to be considered: + + - The change of fields and the signature of remotable method needs a bump of object + version. + - The arguments of methods can only be added as optional, they cannot be + removed or changed in an incompatible way. + - Fields types cannot be changed. If it is a must, create a new field and + deprecate the old one. + - When new version objects communicate with old version objects, + obj_make_compatible() will be called to convert objects to the target version during + serialization. So objects should implement their own obj_make_compatible() to + remove/alter attributes which was added/changed after the target version. + - There is a test (object/test_objects.py) to generate the hash of object fields and the + signtures of remotable methods, which helps developers to check if the change of + objects need a version bump. The object fingerprint should only be updated with a + version bump. + + diff --git a/doc/source/index.rst b/doc/source/index.rst index a7d29271a5..46ce77122c 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -64,6 +64,7 @@ Introduction dev/architecture dev/states dev/contributing + dev/code-contribution-guide .. toctree:: dev/dev-quickstart