]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Completed model and controller code
authorBabu Shanmugam <anbu@enovance.com>
Fri, 7 Feb 2014 10:25:21 +0000 (15:55 +0530)
committerBabu Shanmugam <anbu@enovance.com>
Fri, 7 Feb 2014 10:25:21 +0000 (15:55 +0530)
1. GET, PUT and DELETE request are added
2. Removed public folder as it will never be used

server/ceph_brag.egg-info/SOURCES.txt
server/ceph_brag/app.py
server/ceph_brag/controllers/root.py
server/ceph_brag/json.py [new file with mode: 0644]
server/ceph_brag/model/__init__.py
server/ceph_brag/model/db.py
server/ceph_brag/tests/test_functional.py
server/config.py
server/public/css/style.css [deleted file]
server/public/images/logo.png [deleted file]

index b47f0a6eba3ff4b0741c826a3f98d2debbb82675..9c182f9a2704638f8a4a70cc6de2144dd3e2937e 100644 (file)
@@ -1,8 +1,10 @@
 MANIFEST.in
+config.py
 setup.cfg
 setup.py
 ceph_brag/__init__.py
 ceph_brag/app.py
+ceph_brag/json.py
 ceph_brag.egg-info/PKG-INFO
 ceph_brag.egg-info/SOURCES.txt
 ceph_brag.egg-info/dependency_links.txt
@@ -17,5 +19,3 @@ ceph_brag/tests/__init__.py
 ceph_brag/tests/config.py
 ceph_brag/tests/test_functional.py
 ceph_brag/tests/test_units.py
-public/css/style.css
-public/images/logo.png
\ No newline at end of file
index 6cdc579d7804e5f8ee446eed1b86441be4c4f0e1..340c60d916a89747e683a584e7118e1c30a8b760 100644 (file)
@@ -1,5 +1,5 @@
 from pecan import make_app
-from ceph_brag import model
+from ceph_brag import model, json
 from pecan.hooks import TransactionHook
 
 def setup_app(config):
index 88aff5c6774ec30ac2ee21525f8798762580de81..b83c460d880831b3e3b610cde9ec479c18a3e335 100644 (file)
@@ -1,27 +1,69 @@
 from pecan import expose, request, abort, response
 from webob.exc import status_map
 from pecan.rest import RestController
-from ceph_brag.model.db import put_new_version
+from ceph_brag.model import db
 import sys, traceback
 
 class RootController(RestController):
-    @expose()
+    @expose('json')
     def get(self, *args, **kwargs):
-        return ""
+        if len(args) is 0:
+            #return the list of uuids
+            try:
+                result = db.get_uuids()
+            except Exception as e:
+                traceback.print_exc()
+                abort(500, comment="Internal Server Error")
+        elif len(args) is 1 or len(args) is 2 and args[1] == '':
+            #/uuid
+            try:
+                result = db.get_versions(args[0])
+            except Exception as e:
+                traceback.print_exc()
+                abort(status_code=500, comment="Internal Server Error")
+           
+            if result is None:
+                abort(400, comment="Invalid UUID")
+        elif len(args) is 2 or len(args) is 3 and args[2] == '':
+            #/uuid/version_number
+            try:
+                result = db.get_brag(args[0], args[1])
+            except Exception as e:
+                traceback.print_exc()
+                abort(status_code=500, comment="Internal Server Error")
 
-    @expose()
+            if result is None:
+                abort(status_code=400, comment="Invalid UUID,version combination")
+        else: 
+            abort(status_code=400, comment="Invalid args")
+        
+        return result
+
+    @expose(content_type='application/json')
     def put(self, *args, **kwargs):
         try:
-          put_new_version(request.body)
+            db.put_new_version(request.body)
         except Exception as e:
-          print >> sys.stderr, "Got an exception " + str(e)
-          traceback.print_exc()
-          abort(status_code=500, comment="Internal Server Error")
-        
-        print >> sys.stderr, "Successfully completed the new version"
-        response.status_int = 201
-        return "Created"
+            traceback.print_exc()
+            abort(status_code=500, comment="Internal Server Error")
+       
+        response.status = 201
+        return "CREATED"
     
     @expose()
-    def delete(self):
-        return ""
+    def delete(self, *args, **kwargs):
+        uuid = kwargs['uuid']
+        if uuid is None:
+            abort(status_code=400, comment="Required uuid parameter")
+
+        try:
+            status = db.delete_uuid(uuid)
+        except Exception as e:
+            traceback.print_exc()
+            abort(status_code=500, comment="Internal Server Error")
+        
+        if status is not None:
+            abort(status_code=status['status'], comment=status['comment'])
+    
+        response.status=200
+        return "DELETED"
diff --git a/server/ceph_brag/json.py b/server/ceph_brag/json.py
new file mode 100644 (file)
index 0000000..2f51281
--- /dev/null
@@ -0,0 +1,67 @@
+from pecan.jsonify import jsonify
+from ceph_brag.model import db 
+
+@jsonify.register(db.version_info)
+def jsonify_version(vi):
+    return dict(
+            version_id=vi.index,
+            version_number=vi.version_number,
+            version_date=str(vi.version_date)
+            )
+
+@jsonify.register(db.cluster_info)
+def jsonify_cluster_info(ci):
+    return dict(
+              uuid=ci.uuid,
+              organization=ci.organization,
+              email=ci.contact_email,
+              cluster_name=ci.cluster_name,
+              cluster_creation_date=str(ci.cluster_creation_date),
+              )
+
+@jsonify.register(db.components_info)
+def jsonify_components_info(comps):
+    return dict(
+            bytes={'count':comps.byte_count, 'scale':comps.byte_scale},
+            osds=comps.num_osds,
+            objects=comps.num_objects,
+            pgs=comps.num_pgs,
+            pools=comps.num_pools,
+            mdss=comps.num_mdss,
+            mons=comps.num_mons
+            )
+
+@jsonify.register(db.pools_info)
+def jsonify_pools_info(pool):
+    return dict(rep_size=pool.pool_rep_size,
+                name=pool.pool_name,
+                id=pool.pool_id
+               )
+
+@jsonify.register(db.osds_info)
+def jsonify_osds_info(osd):
+    return dict(nw_info={'address':osd.nw_address,'hostname':osd.hostname},
+                hw_info={'swap_kb':osd.swap_kb,'mem_kb':osd.mem_kb,
+                         'arch':osd.arch, 'cpu':osd.cpu},
+                id=osd.osd_id,
+                os_info={'os':osd.os,'version':osd.os_version,
+                         'description':osd.os_desc, 'distro':osd.distro},
+                ceph_version=osd.ceph_version
+               )
+
+@jsonify.register(db.brag)
+def jsonify_brag(b):
+    ownership = {'organization':b.ci.organization,
+                 'description':b.ci.description,
+                 'email':b.ci.contact_email,
+                 'name':b.ci.cluster_name
+                } 
+    crush_types=b.comps.crush_types.split(',')
+    return dict(uuid=b.ci.uuid,
+                cluster_creation_date=str(b.ci.cluster_creation_date),
+                components_count=b.comps,
+                crush_types=crush_types,
+                ownership=ownership,
+                pool_metadata=b.pools,
+                sysinfo=b.osds
+                )
index c8a9f71ab97cf0f8603ec7b60f3f6c89d7c4f846..664427d2999380fb5985d80269846df20ae0d824 100644 (file)
@@ -16,18 +16,14 @@ def init_model():
     Base.metadata.create_all(engine)
 
 def start():
-    print >> sys.stderr, " --- MODEL START"
     Session.bind = conf.sqlalchemy.engine
 
 def commit():
-    print >> sys.stderr, " --- MODEL COMMIT"
     Session.commit()
 
 def rollback():
-    print >> sys.stderr, " --- MODEL ROLLBACK"
     Session.rollback()
 
 def clear():
-    print >> sys.stderr, " --- MODEL CLEAR"
     Session.remove()
 
index 96b1933d3b05bac4f0b959ccf8333949d4727e4a..09b5f5c94375df8d8e9c069d450916fa2871d073 100644 (file)
@@ -18,6 +18,7 @@ class cluster_info(Base):
   contact_email = Column(String)
   cluster_name = Column(String)
   cluster_creation_date = Column(DateTime)
+  description = Column(String)
   num_versions = Column(Integer)
 
 class version_info(Base):
@@ -70,6 +71,17 @@ class osds_info(Base):
   distro = Column(String)
   ceph_version = Column(String)
 
+class brag(object):
+  def __init__(self, uuid, version_number):
+    self.ci = Session.query(cluster_info).filter_by(uuid=uuid).first()
+    if self.ci is not None:
+      self.vi = Session.query(version_info).filter_by(cluster_id=self.ci.index, version_number=version_number).first()
+    
+    if self.ci is not None and self.vi is not None:
+      self.comps = Session.query(components_info).filter_by(vid=self.vi.index).first()
+      self.pools = Session.query(pools_info).filter_by(vid=self.vi.index).all()
+      self.osds = Session.query(osds_info).filter_by(vid=self.vi.index).all()
+
 def put_new_version(data):
   info = json.loads(data)
   def add_cluster_info():
@@ -80,6 +92,7 @@ def put_new_version(data):
                         organization=info['ownership']['organization'],
                         contact_email=info['ownership']['email'],
                         cluster_name=info['ownership']['name'],
+                        description=info['ownership']['description'],
                         cluster_creation_date=dt,
                         num_versions=1)
       Session.add(ci)
@@ -143,4 +156,34 @@ def put_new_version(data):
   add_components_info(vi)
   add_pools_info(vi)
   add_osds_info(vi)
-  
+def delete_uuid(uuid):
+  ci = Session.query(cluster_info).filter_by(uuid=uuid).first()
+  if ci is None:
+    return {'status':400, 'comment':'No information for this UUID'}
+
+  for v in Session.query(version_info).filter_by(cluster_id=ci.index).all():
+    Session.query(components_info).filter_by(vid=v.index).delete()
+    Session.query(pools_info).filter_by(vid=v.index).delete()
+    Session.query(osds_info).filter_by(vid=v.index).delete()
+    Session.delete(v)
+
+  Session.delete(ci)
+  return None
+
+def get_uuids():
+  return Session.query(cluster_info).all()
+
+def get_versions(uuid):
+  ci = Session.query(cluster_info).filter_by(uuid=uuid).first()
+  if ci is None:
+    return None
+
+  return Session.query(version_info).filter_by(cluster_id=ci.index).all()
+
+def get_brag(uuid, version_id):
+  b = brag(uuid, version_id)
+  if b.ci is None or b.vi is None:
+    return None
+
+  return b
index a9675cdd9aa9c9a2fe50bd34f2587dc91f34830e..126817ee5d1567f56fe1d31cdc05da6b69bdd16d 100644 (file)
@@ -2,21 +2,20 @@ from unittest import TestCase
 from webtest import TestApp
 from ceph_brag.tests import FunctionalTest
 import sys
+from pecan import request
 
 class TestRootController(FunctionalTest):
 
     def test_get(self):
         response = self.app.get('/?k1=v1&k2=v2')
-        print >> sys.stderr, "Vars of response = " + str(vars(response))
         assert response.status_int == 200
 
-    def test_search(self):
-        response = self.app.post('/', params={'q': 'RestController'})
+    def test_put(self):
+        #response = self.app.put('/', upload_files=[("uploadfield", "/tmp/sample.json")])
+        with open ("/tmp/sample.json", "r") as myfile:
+            data=myfile.read().replace('\n', '')
+        response = self.app.request('/', method='PUT', body=data)
         assert response.status_int == 302
-        assert response.headers['Location'] == (
-            'http://pecan.readthedocs.org/en/latest/search.html'
-            '?q=RestController'
-        )
 
     def test_get_not_found(self):
         response = self.app.get('/a/bogus/url', expect_errors=True)
index 51beebf49f156be0c7a0b1c9e19e16746f9e00ee..b6190da49fdd0106e448e00caac501d1434e6618 100644 (file)
@@ -41,7 +41,7 @@ logging = {
 
 sqlalchemy = {
     'url'           : 'sqlite:////tmp/test.db',
-    'echo'          : True,
+    'echo'          : False,
     'encoding'      : 'utf-8'
 }
 
diff --git a/server/public/css/style.css b/server/public/css/style.css
deleted file mode 100644 (file)
index 55c9db5..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-body {
-  background: #311F00;
-  color: white;
-  font-family: 'Helvetica Neue', 'Helvetica', 'Verdana', sans-serif;
-  padding: 1em 2em;
-}
-
-a {
-  color: #FAFF78;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-div#content  {
-  width: 800px;
-  margin: 0 auto;
-}
-
-form {
-  margin: 0;
-  padding: 0;
-  border: 0;
-}
-
-fieldset {
-  border: 0;
-}
-
-input.error {
-  background: #FAFF78;
-}
-
-header {
-  text-align: center;
-}
-
-h1, h2, h3, h4, h5, h6 {
-  font-family: 'Futura-CondensedExtraBold', 'Futura', 'Helvetica', sans-serif;
-  text-transform: uppercase;
-}
diff --git a/server/public/images/logo.png b/server/public/images/logo.png
deleted file mode 100644 (file)
index 5994d22..0000000
Binary files a/server/public/images/logo.png and /dev/null differ