Add basic client for Rundeck

Change-Id: I4b1a8deedb858ec664d4f888ef78458bd19f102f
diff --git a/_states/rundeck_project.py b/_states/rundeck_project.py
new file mode 100644
index 0000000..2e877a6
--- /dev/null
+++ b/_states/rundeck_project.py
@@ -0,0 +1,58 @@
+import logging
+
+LOG = logging.getLogger(__name__)
+
+
+def present(name, description=''):
+    ret = {
+        'name': name,
+        'changes': {},
+        'result': False,
+        'comment': '',
+        'pchanges': {},
+    }
+    if __opts__['test'] == True:
+        ret['comment'] = 'Nothing to change in the test mode.'
+        ret['result'] = None
+        return ret
+    params = {
+        "description": description,
+    }
+    project = __salt__['rundeck.get_project'](name)
+    if project:
+        config = __salt__['rundeck.create_project_config'](
+            name, params, config=project["config"])
+        if project["config"] != config:
+            LOG.warning("{}: {}".format(project["config"], config))
+            __salt__['rundeck.update_project_config'](name, project, config)
+            ret['comment'] = "Project {} was updated.".format(name)
+            ret['changes'][name] = "UPDATED"
+        else:
+            ret['comment'] = "Project {} is already up to date.".format(name)
+    else:
+        __salt__['rundeck.create_project'](name, params)
+        ret['comment'] = "Project {} was created.".format(name)
+        ret['changes'][name] = "CREATED"
+    ret['result'] = True
+    return ret
+
+
+def absent(name):
+    ret = {
+        'name': name,
+        'changes': {},
+        'result': False,
+        'comment': '',
+        'pchanges': {},
+    }
+    if __opts__['test'] == True:
+        ret['comment'] = 'Nothing to remove in the test mode.'
+        ret['result'] = None
+        return ret
+    project = __salt__['rundeck.get_project'](name)
+    if project:
+        __salt__['rundeck.delete_project'](name)
+        ret['changes'][name] = 'DELETED'
+        ret['comment'] = "Project {} was removed.".format(name)
+    ret['result'] = True
+    return ret