Initial commit

This patch adds initial formula that allow to install Ironic api
and conductor.

Change-Id: I21fe4cd93454ed64277ba6756a591155d0052dc8
diff --git a/_modules/ironicng.py b/_modules/ironicng.py
new file mode 100644
index 0000000..9ed55ef
--- /dev/null
+++ b/_modules/ironicng.py
@@ -0,0 +1,136 @@
+# -*- coding: utf-8 -*-
+
+import logging
+from functools import wraps
+LOG = logging.getLogger(__name__)
+
+# Import third party libs
+HAS_IRONIC = False
+try:
+    from ironicclient import client
+    HAS_IRONIC = True
+except ImportError:
+    pass
+
+__opts__ = {}
+
+
+def __virtual__():
+    '''
+    Only load this module if ironic is installed on this minion.
+    '''
+    if HAS_IRONIC:
+        return 'ironicng'
+    return False
+
+
+def _autheticate(func_name):
+    '''
+    Authenticate requests with the salt keystone module and format return data
+    '''
+    @wraps(func_name)
+    def decorator_method(*args, **kwargs):
+        '''
+        Authenticate request and format return data
+        '''
+        connection_args = {'profile': kwargs.pop('profile', None)}
+        nkwargs = {}
+        for kwarg in kwargs:
+            if 'connection_' in kwarg:
+                connection_args.update({kwarg: kwargs[kwarg]})
+            elif '__' not in kwarg:
+                nkwargs.update({kwarg: kwargs[kwarg]})
+        kstone = __salt__['keystone.auth'](**connection_args)
+        token = kstone.auth_token
+
+        if kwargs.get('connection_endpoint_type') == None:
+            endpoint_type = 'internalURL'
+        else:
+            endpoint_type = kwargs.get('connection_endpoint_type')
+
+        endpoint = kstone.service_catalog.url_for(
+            service_type='baremetal',
+            endpoint_type=endpoint_type)
+        ironic_interface = client.get_client(
+            1,
+            ironic_url=endpoint, os_auth_token=token)
+        return func_name(ironic_interface, *args, **nkwargs)
+    return decorator_method
+
+
+@_autheticate
+def list_nodes(ironic_interface, **kwargs):
+    '''
+    list all ironic nodes
+    CLI Example:
+    .. code-block:: bash
+        salt '*' ironic.list_nodes
+    '''
+    return {'nodes': [x.to_dict() for x
+                      in ironic_interface.node.list(**kwargs)]}
+
+
+@_autheticate
+def create_node(ironic_interface, **kwargs):
+    '''
+    create ironic node
+    CLI Example:
+    .. code-block:: bash
+        salt '*' ironic.create_node
+    '''
+    return ironic_interface.node.create(**kwargs).to_dict()
+
+
+@_autheticate
+def delete_node(ironic_interface, node_id):
+    '''
+    delete ironic node
+
+    :param node_id: UUID or Name of the node.
+    CLI Example:
+    .. code-block:: bash
+        salt '*' ironic.delete_node
+    '''
+    ironic_interface.node.delete(node_id)
+
+
+@_autheticate
+def show_node(ironic_interface, node_id):
+    '''
+    show info about ironic node
+    :param node_id: UUID or Name of the node.
+    CLI Example:
+    .. code-block:: bash
+        salt '*' ironic.show_node
+    '''
+    return ironic_interface.node.get(node_id).to_dict()
+
+
+@_autheticate
+def create_port(ironic_interface, address, node_name=None,
+                node_uuid=None, **kwargs):
+    '''
+    create ironic port
+    CLI Example:
+    .. code-block:: bash
+        salt '*' ironic.crate_port
+    '''
+    node_uuid = node_uuid or ironic_interface.node.get(
+        node_name).to_dict()['uuid']
+    return ironic_interface.port.create(
+        address=address, node_uuid=node_uuid, **kwargs).to_dict()
+
+
+@_autheticate
+def list_ports(ironic_interface, **kwargs):
+    '''
+    list all ironic ports
+    CLI Example:
+    .. code-block:: bash
+        salt '*' ironic.list_ports
+    '''
+
+    return {'ports': [x.to_dict() for x
+                      in ironic_interface.port.list(**kwargs)]}
+
+