From 7803466ed2b12502a4e16bbe4f1c2078a0198646 Mon Sep 17 00:00:00 2001 From: "Yuanbin.Chen" Date: Tue, 23 Jan 2018 17:35:47 +0800 Subject: [PATCH] Add clustering guides node file, examples node code Change-Id: I905c424f86ef1f838ad2b637cb623f9ce7025466 Signed-off-by: Yuanbin.Chen --- doc/source/user/guides/clustering/node.rst | 104 ++++++++++++++++++++- examples/clustering/node.py | 93 ++++++++++++++++++ 2 files changed, 196 insertions(+), 1 deletion(-) create mode 100644 examples/clustering/node.py diff --git a/doc/source/user/guides/clustering/node.rst b/doc/source/user/guides/clustering/node.rst index d4e2f54f1..ec89ed48b 100644 --- a/doc/source/user/guides/clustering/node.rst +++ b/doc/source/user/guides/clustering/node.rst @@ -15,4 +15,106 @@ Managing Nodes ============== -.. TODO(Qiming): Implement this guide +Node is a logical object managed by the Senlin service. A node can be a member +of at most one cluster at any time. A node can be an orphan node which means +it doesn't belong to any clusters. + + +List Nodes +~~~~~~~~~~ + +To examine the list of Nodes: + +.. literalinclude:: ../../examples/clustering/node.py + :pyobject: list_nodes + +When listing nodes, you can specify the sorting option using the ``sort`` +parameter and you can do pagination using the ``limit`` and ``marker`` +parameters. + +Full example: `manage node`_ + + +Create Node +~~~~~~~~~~~ + +When creating a node, you will provide a dictionary with keys and values +according to the node type referenced. + +.. literalinclude:: ../../examples/clustering/node.py + :pyobject: create_node + +Optionally, you can specify a ``metadata`` keyword argument that contains some +key-value pairs to be associated with the node. + +Full example: `manage node`_ + + +Get Node +~~~~~~~~ + +To get a node based on its name or ID: + +.. literalinclude:: ../../examples/clustering/node.py + :pyobject: get_node + +Full example: `manage node`_ + + +Find Node +~~~~~~~~~ + +To find a node based on its name or ID: + +.. literalinclude:: ../../examples/clustering/node.py + :pyobject: find_node + +Full example: `manage node`_ + + +Update Node +~~~~~~~~~~~ + +After a node is created, most of its properties are immutable. Still, you +can update a node's ``name`` and/or ``params``. + +.. literalinclude:: ../../examples/clustering/node.py + :pyobject: update_node + +Full example: `manage node`_ + + +Delete Node +~~~~~~~~~~~ + +A node can be deleted after creation, provided that it is not referenced +by any active clusters. If you attempt to delete a node that is still in +use, you will get an error message. + +.. literalinclude:: ../../examples/clustering/node.py + :pyobject: delete_node + +Full example: `manage node`_ + + +Check Node +~~~~~~~~~~ + +If the underlying physical resource is not healthy, the node will be set +to ERROR status. + +.. literalinclude:: ../../examples/clustering/node.py + :pyobject: check_node + +Full example: `manage node`_ + + +Recover Node +~~~~~~~~~~~~ + +To restore a specified node. + +.. literalinclude:: ../../examples/clustering/node.py + :pyobject: recover_node + +.. _manage node: http://git.openstack.org/cgit/openstack/python-openstacksdk/tree/examples/clustering/node.py diff --git a/examples/clustering/node.py b/examples/clustering/node.py new file mode 100644 index 000000000..40910b452 --- /dev/null +++ b/examples/clustering/node.py @@ -0,0 +1,93 @@ +# 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. + +""" +Managing policies in the Cluster service. + +For a full guide see +https://developer.openstack.org/sdks/python/openstacksdk/user/guides/cluster.html +""" + +NODE_NAME = 'Test_Node' +NODE_ID = 'dd803d4a-015d-4223-b15f-db29bad3146c' +PROFILE_ID = "b0e3a680-e270-4eb8-9361-e5c9503fba0a" + + +def list_nodes(conn): + print("List Nodes:") + + for node in conn.clustering.nodes(): + print(node.to_dict()) + for node in conn.clustering.nodes(sort='asc:name'): + print(node.to_dict()) + + +def create_node(conn): + print("Create Node:") + + spec = { + 'name': NODE_NAME, + 'profile_id': PROFILE_ID, + } + node = conn.clustering.create_node(**spec) + print(node.to_dict()) + + +def get_node(conn): + print("Get Node:") + + node = conn.clustering.get_node(NODE_ID) + print(node.to_dict()) + + +def find_node(conn): + print("Find Node:") + + node = conn.clustering.find_node(NODE_ID) + print(node.to_dict()) + + +def update_node(conn): + print("Update Node:") + + spec = { + 'name': 'Test_Node01', + 'profile_id': 'c0e3a680-e270-4eb8-9361-e5c9503fba0b', + } + + node = conn.clustering.update_node(NODE_ID, **spec) + print(node.to_dict()) + + +def delete_node(conn): + print("Delete Node:") + + conn.clustering.delete_node(NODE_ID) + print("Node deleted.") + # node support force delete + conn.clustering.delete_node(NODE_ID, False, True) + print("Node deleted") + + +def check_node(conn): + print("Check Node:") + + node = conn.clustering.check_node(NODE_ID) + print(node.to_dict()) + + +def recover_node(conn): + print("Recover Node:") + + spec = {'check': True} + node = conn.clustering.recover_node(NODE_ID, **spec) + print(node.to_dict())