Changeset d018a07 in trunk


Ignore:
Timestamp:
2017-07-27T22:59:03Z (8 years ago)
Author:
Brian Warner <warner@…>
Branches:
master
Children:
0386e0d5, bd1e450
Parents:
0d278e35 (diff), e32f581 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge PR430: add JSON welcome page

closes ticket:2476

Files:
3 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified docs/frontends/webapi.rst

    r0d278e35 rd018a07  
    18511851              servers.
    18521852
     1853``GET /?t=json``   (the json welcome page)
     1854
     1855This is the "json Welcome Page", and contains connectivity status
     1856of the introducer(s) and storage server(s), here's an example::
     1857
     1858  {
     1859   "introducers": {
     1860    "statuses": []
     1861   },
     1862   "servers": [{
     1863     "nodeid": "other_nodeid",
     1864     "available_space": 123456,
     1865     "nickname": "George \u263b",
     1866     "version": "1.0",
     1867     "connection_status": "summary",
     1868     "last_received_data": 1487811257
     1869    }]
     1870  }
     1871
     1872
     1873The above json ``introducers`` section includes a list of
     1874introducer connectivity status messages.
     1875
     1876The above json ``servers`` section is an array with map elements.  Each map
     1877has the following properties:
     1878
     18791. ``nodeid`` - an identifier derived from the node's public key
     18802. ``available_space`` - the available space in bytes expressed as an integer
     18813. ``nickname`` - the storage server nickname
     18824. ``version`` - the storage server Tahoe-LAFS version
     18835. ``connection_status`` - connectivity status
     18846. ``last_received_data`` - the time when data was last received,
     1885   expressed in seconds since epoch
     1886
    18531887``GET /status/``
    18541888
  • TabularUnified src/allmydata/test/web/test_web.py

    r0d278e35 rd018a07  
    185185        self.last_rx_time = last_rx_time
    186186        self.last_connect_time = last_connect_time
     187
    187188    def on_status_changed(self, cb): # TODO: try to remove me
    188189        cb(self)
    189190    def is_connected(self): # TODO: remove me
    190191        return self.connected
     192    def get_version(self):
     193        return {
     194            "application-version": "1.0"
     195        }
    191196    def get_permutation_seed(self):
    192197        return ""
     
    258263        self.storage_broker.test_add_server("disconnected_nodeid",
    259264            FakeDisplayableServer(
    260                 serverid="other_nodeid", nickname=u"disconnected_nickname \u263B", connected = False,
     265                serverid="disconnected_nodeid", nickname=u"disconnected_nickname \u263B", connected = False,
    261266                last_connect_time = None, last_loss_time = 25, last_rx_time = 35))
    262267        self.introducer_client = None
     
    734739    def test_create(self):
    735740        pass
     741
     742    maxDiff = None
     743    def test_welcome_json(self):
     744        """
     745        There is a JSON version of the welcome page which can be selected with the
     746        ``t`` query argument.
     747        """
     748        d = self.GET("/?t=json")
     749        def _check(res):
     750            decoded = json.loads(res)
     751            expected = {
     752                u'introducers': {
     753                    u'statuses': [],
     754                },
     755                u'servers': sorted([
     756                    {u"nodeid": u'other_nodeid',
     757                     u'available_space': 123456,
     758                     u'connection_status': u'summary',
     759                     u'last_received_data': 30,
     760                     u'nickname': u'other_nickname \u263b',
     761                     u'version': u'1.0',
     762                    },
     763                    {u"nodeid": u'disconnected_nodeid',
     764                     u'available_space': 123456,
     765                     u'connection_status': u'summary',
     766                     u'last_received_data': 35,
     767                     u'nickname': u'disconnected_nickname \u263b',
     768                     u'version': u'1.0',
     769                    },
     770                ]),
     771            }
     772            self.assertEqual(expected, decoded)
     773        d.addCallback(_check)
     774        return d
    736775
    737776    def test_welcome(self):
  • TabularUnified src/allmydata/web/root.py

    r0d278e35 rd018a07  
    1 import time, os
     1import time, os, json
    22
    33from twisted.web import http
     
    1313from allmydata.web import filenode, directory, unlinked, status, operations
    1414from allmydata.web import storage, magic_folder
    15 from allmydata.web.common import abbreviate_size, getxmlfile, WebError, \
    16      get_arg, RenderMixin, get_format, get_mutable_type, render_time_delta, render_time, render_time_attr
     15from allmydata.web.common import (
     16    abbreviate_size,
     17    getxmlfile,
     18    WebError,
     19    get_arg,
     20    MultiFormatPage,
     21    RenderMixin,
     22    get_format,
     23    get_mutable_type,
     24    render_time_delta,
     25    render_time,
     26    render_time_attr,
     27)
    1728
    1829
     
    127138SPACE = u"\u00A0"*2
    128139
    129 class Root(rend.Page):
     140class Root(MultiFormatPage):
    130141
    131142    addSlash = True
     
    183194        tubid_s = "TubID: "+self.client.get_long_tubid()
    184195        return T.td(title=tubid_s)[self.client.get_long_nodeid()]
     196
    185197    def data_my_nickname(self, ctx, data):
    186198        return self.client.nickname
     199
     200
     201    def render_JSON(self, req):
     202        req.setHeader("content-type", "application/json; charset=utf-8")
     203        intro_summaries = [s.summary for s in self.client.introducer_connection_statuses()]
     204        sb = self.client.get_storage_broker()
     205        servers = self._describe_known_servers(sb)
     206        result = {
     207            "introducers": {
     208                "statuses": intro_summaries,
     209            },
     210            "servers": servers
     211        }
     212        return json.dumps(result, indent=1) + "\n"
     213
     214
     215    def _describe_known_servers(self, broker):
     216        return sorted(list(
     217            self._describe_server(server)
     218            for server
     219            in broker.get_known_servers()
     220        ))
     221
     222
     223    def _describe_server(self, server):
     224        status = server.get_connection_status()
     225        description = {
     226            u"nodeid": server.get_serverid(),
     227            u"connection_status": status.summary,
     228            u"available_space": server.get_available_space(),
     229            u"nickname": server.get_nickname(),
     230            u"version": None,
     231            u"last_received_data": status.last_received_time,
     232        }
     233        version = server.get_version()
     234        if version is not None:
     235            description[u"version"] = version["application-version"]
     236
     237        return description
     238
    187239
    188240    def render_magic_folder(self, ctx, data):
Note: See TracChangeset for help on using the changeset viewer.