{"action":"created","comment":{"url":"https://api.github.com/repos/DIRACGrid/DIRAC/pulls/comments/302894229","pull_request_review_id":261141578,"id":302894229,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDMwMjg5NDIyOQ==","diff_hunk":"@@ -0,0 +1,404 @@\n+\"\"\" This is the Regression test for DIRAC.MonitoringSystem.private.Plotters in order to ensure\n+    the proper working of the plotter.\n+\"\"\"\n+\n+from __future__ import absolute_import\n+import unittest\n+\n+import sys\n+import math\n+import operator\n+from PIL import Image\n+\n+from DIRAC.MonitoringSystem.private.Plotters.ComponentMonitoringPlotter import ComponentMonitoringPlotter\n+from functools import reduce\n+from six.moves import map\n+\n+\n+def compare(file1Path, file2Path):\n+  '''\n+    Function used to compare two plots\n+\n+    returns 0.0 if both are identical\n+  '''\n+  # Crops image to remove the \"Generated on xxxx UTC\" string\n+  image1 = Image.open(file1Path).crop((0, 0, 800, 570))\n+  image2 = Image.open(file2Path).crop((0, 0, 800, 570))\n+  h1 = image1.histogram()\n+  h2 = image2.histogram()\n+  rms = math.sqrt(reduce(operator.add,\n+                         list(map(lambda a, b: (a - b) ** 2, h1, h2))) / len(h1))\n+  return rms\n+\n+\n+class PlotterTestCase(unittest.TestCase):\n+\n+  def setUp(self):\n+    pass\n+\n+  def tearDown(self):\n+    pass\n+\n+\n+class ComponentMonitoringPlotterUnitTest(PlotterTestCase):\n+  \"\"\" First you will need to generate plots on the DIRAC WebApp and then add it to the\n+      DIRAC/tests/Integration/Monitoring/png/ folder.\n+      Then change the data dictionary here according to the WebApp plot and then run this regression test.\n+  \"\"\"\n+\n+  def test_plotRunningThreads(self):\n+    \"\"\" test for the method \"_plotRunningThreads\"\n+    \"\"\"\n+\n+    plotName = \"ComponentMonitoringPlotter_plotRunningThreads\"\n+    reportRequest = {'grouping': 'component',\n+                     'groupingFields': ('%s', ['component']),\n+                     'startTime': 1562796000,\n+                     'endTime': 1562882400,\n+                     'condDict': {'component': 'Monitoring_Monitoring'}\n+                     }\n+\n+    plotInfo = {'data': {'Monitoring_Monitoring': {1562853600: 9.0,\n+                                                   1562857200: 0,\n+                                                   1562854500: 0,\n+                                                   1562855400: 0,\n+                                                   1562856300: 0,\n+                                                   1562858100: 0,\n+                                                   1562849100: 9.75,\n+                                                   1562860800: 0,\n+                                                   1562850000: 10.0,\n+                                                   1562848200: 9.142857142857142,\n+                                                   1562859900: 0,\n+                                                   1562850900: 9.428571428571429,\n+                                                   1562851800: 9.0,\n+                                                   1562847300: 8.5,\n+                                                   1562852700: 9.0}\n+                         },\n+                'unit': 'threads',\n+                'granularity': 900}\n+\n+    obj = ComponentMonitoringPlotter(None, None)\n+    res = obj._plotRunningThreads(reportRequest, plotInfo, plotName)\n+    self.assertEqual(res['OK'], True)\n+    self.assertEqual(res['Value'], {'plot': True, 'thumbnail': False})\n+\n+    res = compare('%s.png' % plotName, '/opt/dirac/DIRAC/tests/Integration/Monitoring/png/%s.png' % plotName)\n+    self.assertEqual(0.0, res)\n+\n+  def test_plotCpuUsage(self):\n+    \"\"\" test for the method \"_plotCpuUsage\"\n+    \"\"\"\n+\n+    plotName = \"ComponentMonitoringPlotter_plotCpuUsage\"\n+    reportRequest = {'grouping': 'component',\n+                     'groupingFields': ('%s', ['component']),\n+                     'startTime': 1562796000,\n+                     'endTime': 1562882400,\n+                     'condDict': {'component': 'Monitoring_Monitoring'}\n+                     }\n+\n+    plotInfo = {'data': {'Monitoring_Monitoring': {1562857200: 0,\n+                                                   1562854500: 0,\n+                                                   1562855400: 0,\n+                                                   1562856300: 0,\n+                                                   1562858100: 0,\n+                                                   1562849100: 2.5875000450760126,\n+                                                   1562850000: 0.9428571707436016,\n+                                                   1562848200: 2.171428546309471,\n+                                                   1562859900: 0,\n+                                                   1562850900: 0.9428571473274913,\n+                                                   1562851800: 0.10000000149011612,\n+                                                   1562847300: 4.950000047683716,\n+                                                   1562852700: 0.033333333830038704}\n+                         },\n+                'unit': 'percentage',\n+                'granularity': 900}\n+\n+    obj = ComponentMonitoringPlotter(None, None)\n+    res = obj._plotCpuUsage(reportRequest, plotInfo, plotName)\n+    self.assertEqual(res['OK'], True)\n+    self.assertEqual(res['Value'], {'plot': True, 'thumbnail': False})\n+\n+    res = compare('%s.png' % plotName, '/opt/dirac/DIRAC/tests/Integration/Monitoring/png/%s.png' % plotName)\n+    self.assertEqual(0.0, res)\n+\n+  def test_plotMemoryUsage(self):\n+    \"\"\" test for the method \"_plotMemoryUsage\"\n+    \"\"\"\n+\n+    plotName = \"ComponentMonitoringPlotter_plotMemoryUsage\"\n+    reportRequest = {'grouping': 'component',\n+                     'groupingFields': ('%s', ['component']),\n+                     'startTime': 1562796000,\n+                     'endTime': 1562882400,\n+                     'condDict': {'component': 'Monitoring_Monitoring'}\n+                     }\n+\n+    plotInfo = {'data': {'Monitoring_Monitoring': {1562853600: 93.03776041666667,\n+                                                   1562857200: 0,\n+                                                   1562854500: 0,\n+                                                   1562855400: 0,\n+                                                   1562856300: 0,\n+                                                   1562858100: 0,\n+                                                   1562849100: 249.76318359375,\n+                                                   1562860800: 0,\n+                                                   1562850000: 165.26674107142858,\n+                                                   1562848200: 260.68917410714283,\n+                                                   1562859900: 0,\n+                                                   1562850900: 180.12890625,\n+                                                   1562851800: 186.35546875,\n+                                                   1562847300: 121.13671875,\n+                                                   1562852700: 186.35807291666666}\n+                         },\n+                'unit': 'MB',\n+                'granularity': 900}\n+\n+    obj = ComponentMonitoringPlotter(None, None)\n+    res = obj._plotMemoryUsage(reportRequest, plotInfo, plotName)\n+    self.assertEqual(res['OK'], True)\n+    self.assertEqual(res['Value'], {'plot': True, 'thumbnail': False})\n+\n+    res = compare('%s.png' % plotName, '/opt/dirac/DIRAC/tests/Integration/Monitoring/png/%s.png' % plotName)\n+    self.assertEqual(0.0, res)\n+\n+  def test_plotRunningTime(self):\n+    \"\"\" test for the method \"_plotRunningTime\"\n+    \"\"\"\n+\n+    plotName = \"ComponentMonitoringPlotter_plotRunningTime\"\n+    reportRequest = {'grouping': 'component',\n+                     'groupingFields': ('%s', ['component']),\n+                     'startTime': 1562796000,\n+                     'endTime': 1562882400,\n+                     'condDict': {'component': 'Monitoring_Monitoring'}\n+                     }\n+\n+    plotInfo = {'data': {'Monitoring_Monitoring': {1562853600: 313.32080459594727,\n+                                                   1562857200: 0,\n+                                                   1562854500: 0,\n+                                                   1562855400: 0,\n+                                                   1562856300: 0,\n+                                                   1562858100: 0,\n+                                                   1562849100: 1754.9678344726562,\n+                                                   1562860800: 0,\n+                                                   1562850000: 492.68797302246094,\n+                                                   1562848200: 854.48386492048,\n+                                                   1562859900: 0,\n+                                                   1562850900: 1332.7680140904017,\n+                                                   1562851800: 1812.8760986328125,\n+                                                   1562847300: 314.9701385498047,\n+                                                   1562852700: 3452.56787109375}\n+                         },\n+                'unit': 'seconds',\n+                'granularity': 900}\n+\n+    obj = ComponentMonitoringPlotter(None, None)\n+    res = obj._plotRunningTime(reportRequest, plotInfo, plotName)\n+    self.assertEqual(res['OK'], True)\n+    self.assertEqual(res['Value'], {'plot': True, 'thumbnail': False})\n+\n+    res = compare('%s.png' % plotName, '/opt/dirac/DIRAC/tests/Integration/Monitoring/png/%s.png' % plotName)\n+    self.assertEqual(0.0, res)\n+\n+  def test_plotConnections(self):\n+    \"\"\" test for the method \"_plotConnections\"\n+    \"\"\"\n+\n+    plotName = \"ComponentMonitoringPlotter_plotConnections\"\n+    reportRequest = {'grouping': 'component',\n+                     'groupingFields': ('%s', ['component']),\n+                     'startTime': 1562796000,\n+                     'endTime': 1562882400,\n+                     'condDict': {'component': 'Monitoring_Monitoring'}\n+                     }\n+\n+    plotInfo = {'data': {'Monitoring_Monitoring': {1562853600: 0,\n+                                                   1562857200: 1.0,\n+                                                   1562854500: 1.0,\n+                                                   1562855400: 1.0,\n+                                                   1562856300: 1.0,\n+                                                   1562858100: 1.0,\n+                                                   1562849100: 0,\n+                                                   1562860800: 1.0,\n+                                                   1562850000: 0,\n+                                                   1562848200: 0,\n+                                                   1562859900: 0,\n+                                                   1562850900: 0,\n+                                                   1562851800: 0,\n+                                                   1562847300: 0,\n+                                                   1562852700: 0}\n+                         },\n+                'unit': 'Connections',\n+                'granularity': 900}\n+\n+    obj = ComponentMonitoringPlotter(None, None)\n+    res = obj._plotConnections(reportRequest, plotInfo, plotName)\n+    self.assertEqual(res['OK'], True)\n+    self.assertEqual(res['Value'], {'plot': True, 'thumbnail': False})\n+\n+    res = compare('%s.png' % plotName, '/opt/dirac/DIRAC/tests/Integration/Monitoring/png/%s.png' % plotName)\n+    self.assertEqual(0.0, res)\n+\n+  def test_plotActiveQueries(self):\n+    \"\"\" test for the method \"_plotActiveQueries\"\n+    \"\"\"\n+\n+    plotName = \"ComponentMonitoringPlotter_plotActiveQueries\"\n+    reportRequest = {'grouping': 'component',\n+                     'groupingFields': ('%s', ['component']),\n+                     'startTime': 1562796000,\n+                     'endTime': 1562882400,\n+                     'condDict': {'component': 'Monitoring_Monitoring'}\n+                     }\n+\n+    plotInfo = {'data': {'Monitoring_Monitoring': {1562853600: 0,\n+                                                   1562857200: 0.06666666666666667,\n+                                                   1562854500: 0,\n+                                                   1562855400: 0.2,\n+                                                   1562856300: 0,\n+                                                   1562858100: 0,\n+                                                   1562849100: 0,\n+                                                   1562860800: 0,\n+                                                   1562850000: 0,\n+                                                   1562848200: 0,\n+                                                   1562859900: 0,\n+                                                   1562850900: 0,\n+                                                   1562851800: 0,\n+                                                   1562847300: 0,\n+                                                   1562852700: 0}\n+                         },\n+                'unit': 'ActiveQueries',\n+                'granularity': 900}\n+\n+    obj = ComponentMonitoringPlotter(None, None)\n+    res = obj._plotActiveQueries(reportRequest, plotInfo, plotName)\n+    self.assertEqual(res['OK'], True)\n+    self.assertEqual(res['Value'], {'plot': True, 'thumbnail': False})\n+\n+    res = compare('%s.png' % plotName, '/opt/dirac/DIRAC/tests/Integration/Monitoring/png/%s.png' % plotName)\n+    self.assertEqual(0.0, res)\n+\n+  def test_plotPendingQueries(self):\n+    \"\"\" test for the method \"_plotPendingQueries\"\n+    \"\"\"\n+\n+    plotName = \"ComponentMonitoringPlotter_plotPendingQueries\"\n+    reportRequest = {'grouping': 'component',\n+                     'groupingFields': ('%s', ['component']),\n+                     'startTime': 1562796000,\n+                     'endTime': 1562882400,\n+                     'condDict': {'component': 'Monitoring_Monitoring'}\n+                     }\n+\n+    plotInfo = {'data': {'Monitoring_Monitoring': {1562853600: 0,\n+                                                   1562857200: 0,\n+                                                   1562854500: 0,\n+                                                   1562855400: 0,\n+                                                   1562856300: 0,\n+                                                   1562858100: 0,\n+                                                   1562849100: 0,\n+                                                   1562860800: 0,\n+                                                   1562850000: 0,\n+                                                   1562848200: 0,\n+                                                   1562859900: 0,\n+                                                   1562850900: 0,\n+                                                   1562851800: 0,\n+                                                   1562847300: 0,\n+                                                   1562852700: 0}\n+                         },\n+                'unit': 'PendingQueries',\n+                'granularity': 900}\n+\n+    obj = ComponentMonitoringPlotter(None, None)\n+    res = obj._plotPendingQueries(reportRequest, plotInfo, plotName)\n+    self.assertEqual(res['OK'], True)\n+    self.assertEqual(res['Value'], {'plot': True, 'thumbnail': False})\n+\n+    res = compare('%s.png' % plotName, '/opt/dirac/DIRAC/tests/Integration/Monitoring/png/%s.png' % plotName)","path":"tests/Integration/Monitoring/Test_Plotter.py","position":317,"original_position":317,"commit_id":"8e0142a5a834838befa2a000312a3d316aec4f3e","original_commit_id":"8e0142a5a834838befa2a000312a3d316aec4f3e","user":{"login":"zmathe","id":981448,"node_id":"MDQ6VXNlcjk4MTQ0OA==","avatar_url":"https://avatars3.githubusercontent.com/u/981448?v=4","gravatar_id":"","url":"https://api.github.com/users/zmathe","html_url":"https://github.com/zmathe","followers_url":"https://api.github.com/users/zmathe/followers","following_url":"https://api.github.com/users/zmathe/following{/other_user}","gists_url":"https://api.github.com/users/zmathe/gists{/gist_id}","starred_url":"https://api.github.com/users/zmathe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zmathe/subscriptions","organizations_url":"https://api.github.com/users/zmathe/orgs","repos_url":"https://api.github.com/users/zmathe/repos","events_url":"https://api.github.com/users/zmathe/events{/privacy}","received_events_url":"https://api.github.com/users/zmathe/received_events","type":"User","site_admin":false},"body":"same","created_at":"2019-07-12T09:05:35Z","updated_at":"2019-07-12T09:06:04Z","html_url":"https://github.com/DIRACGrid/DIRAC/pull/4120#discussion_r302894229","pull_request_url":"https://api.github.com/repos/DIRACGrid/DIRAC/pulls/4120","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/DIRACGrid/DIRAC/pulls/comments/302894229"},"html":{"href":"https://github.com/DIRACGrid/DIRAC/pull/4120#discussion_r302894229"},"pull_request":{"href":"https://api.github.com/repos/DIRACGrid/DIRAC/pulls/4120"}}},"pull_request":{"url":"https://api.github.com/repos/DIRACGrid/DIRAC/pulls/4120","id":287945229,"node_id":"MDExOlB1bGxSZXF1ZXN0Mjg3OTQ1MjI5","html_url":"https://github.com/DIRACGrid/DIRAC/pull/4120","diff_url":"https://github.com/DIRACGrid/DIRAC/pull/4120.diff","patch_url":"https://github.com/DIRACGrid/DIRAC/pull/4120.patch","issue_url":"https://api.github.com/repos/DIRACGrid/DIRAC/issues/4120","number":4120,"state":"open","locked":false,"title":"[WIP][integration] Add ES monitoring support to Core/DISET/private/Service.py","user":{"login":"pujanm","id":26873907,"node_id":"MDQ6VXNlcjI2ODczOTA3","avatar_url":"https://avatars1.githubusercontent.com/u/26873907?v=4","gravatar_id":"","url":"https://api.github.com/users/pujanm","html_url":"https://github.com/pujanm","followers_url":"https://api.github.com/users/pujanm/followers","following_url":"https://api.github.com/users/pujanm/following{/other_user}","gists_url":"https://api.github.com/users/pujanm/gists{/gist_id}","starred_url":"https://api.github.com/users/pujanm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pujanm/subscriptions","organizations_url":"https://api.github.com/users/pujanm/orgs","repos_url":"https://api.github.com/users/pujanm/repos","events_url":"https://api.github.com/users/pujanm/events{/privacy}","received_events_url":"https://api.github.com/users/pujanm/received_events","type":"User","site_admin":false},"body":"This will add ES support to the DISET Service and will extend the monitoring system.","created_at":"2019-06-13T14:09:57Z","updated_at":"2019-07-12T09:06:04Z","closed_at":null,"merged_at":null,"merge_commit_sha":"75628001e815fd78f31adf8588c8928a75fbb829","assignee":null,"assignees":[],"requested_reviewers":[{"login":"atsareg","id":679892,"node_id":"MDQ6VXNlcjY3OTg5Mg==","avatar_url":"https://avatars1.githubusercontent.com/u/679892?v=4","gravatar_id":"","url":"https://api.github.com/users/atsareg","html_url":"https://github.com/atsareg","followers_url":"https://api.github.com/users/atsareg/followers","following_url":"https://api.github.com/users/atsareg/following{/other_user}","gists_url":"https://api.github.com/users/atsareg/gists{/gist_id}","starred_url":"https://api.github.com/users/atsareg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/atsareg/subscriptions","organizations_url":"https://api.github.com/users/atsareg/orgs","repos_url":"https://api.github.com/users/atsareg/repos","events_url":"https://api.github.com/users/atsareg/events{/privacy}","received_events_url":"https://api.github.com/users/atsareg/received_events","type":"User","site_admin":false},{"login":"fstagni","id":785576,"node_id":"MDQ6VXNlcjc4NTU3Ng==","avatar_url":"https://avatars1.githubusercontent.com/u/785576?v=4","gravatar_id":"","url":"https://api.github.com/users/fstagni","html_url":"https://github.com/fstagni","followers_url":"https://api.github.com/users/fstagni/followers","following_url":"https://api.github.com/users/fstagni/following{/other_user}","gists_url":"https://api.github.com/users/fstagni/gists{/gist_id}","starred_url":"https://api.github.com/users/fstagni/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fstagni/subscriptions","organizations_url":"https://api.github.com/users/fstagni/orgs","repos_url":"https://api.github.com/users/fstagni/repos","events_url":"https://api.github.com/users/fstagni/events{/privacy}","received_events_url":"https://api.github.com/users/fstagni/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/DIRACGrid/DIRAC/pulls/4120/commits","review_comments_url":"https://api.github.com/repos/DIRACGrid/DIRAC/pulls/4120/comments","review_comment_url":"https://api.github.com/repos/DIRACGrid/DIRAC/pulls/comments{/number}","comments_url":"https://api.github.com/repos/DIRACGrid/DIRAC/issues/4120/comments","statuses_url":"https://api.github.com/repos/DIRACGrid/DIRAC/statuses/8e0142a5a834838befa2a000312a3d316aec4f3e","head":{"label":"pujanm:integration_monitor-service","ref":"integration_monitor-service","sha":"8e0142a5a834838befa2a000312a3d316aec4f3e","user":{"login":"pujanm","id":26873907,"node_id":"MDQ6VXNlcjI2ODczOTA3","avatar_url":"https://avatars1.githubusercontent.com/u/26873907?v=4","gravatar_id":"","url":"https://api.github.com/users/pujanm","html_url":"https://github.com/pujanm","followers_url":"https://api.github.com/users/pujanm/followers","following_url":"https://api.github.com/users/pujanm/following{/other_user}","gists_url":"https://api.github.com/users/pujanm/gists{/gist_id}","starred_url":"https://api.github.com/users/pujanm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pujanm/subscriptions","organizations_url":"https://api.github.com/users/pujanm/orgs","repos_url":"https://api.github.com/users/pujanm/repos","events_url":"https://api.github.com/users/pujanm/events{/privacy}","received_events_url":"https://api.github.com/users/pujanm/received_events","type":"User","site_admin":false},"repo":{"id":188240183,"node_id":"MDEwOlJlcG9zaXRvcnkxODgyNDAxODM=","name":"DIRAC","full_name":"pujanm/DIRAC","private":false,"owner":{"login":"pujanm","id":26873907,"node_id":"MDQ6VXNlcjI2ODczOTA3","avatar_url":"https://avatars1.githubusercontent.com/u/26873907?v=4","gravatar_id":"","url":"https://api.github.com/users/pujanm","html_url":"https://github.com/pujanm","followers_url":"https://api.github.com/users/pujanm/followers","following_url":"https://api.github.com/users/pujanm/following{/other_user}","gists_url":"https://api.github.com/users/pujanm/gists{/gist_id}","starred_url":"https://api.github.com/users/pujanm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pujanm/subscriptions","organizations_url":"https://api.github.com/users/pujanm/orgs","repos_url":"https://api.github.com/users/pujanm/repos","events_url":"https://api.github.com/users/pujanm/events{/privacy}","received_events_url":"https://api.github.com/users/pujanm/received_events","type":"User","site_admin":false},"html_url":"https://github.com/pujanm/DIRAC","description":"DIRAC Grid","fork":true,"url":"https://api.github.com/repos/pujanm/DIRAC","forks_url":"https://api.github.com/repos/pujanm/DIRAC/forks","keys_url":"https://api.github.com/repos/pujanm/DIRAC/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pujanm/DIRAC/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pujanm/DIRAC/teams","hooks_url":"https://api.github.com/repos/pujanm/DIRAC/hooks","issue_events_url":"https://api.github.com/repos/pujanm/DIRAC/issues/events{/number}","events_url":"https://api.github.com/repos/pujanm/DIRAC/events","assignees_url":"https://api.github.com/repos/pujanm/DIRAC/assignees{/user}","branches_url":"https://api.github.com/repos/pujanm/DIRAC/branches{/branch}","tags_url":"https://api.github.com/repos/pujanm/DIRAC/tags","blobs_url":"https://api.github.com/repos/pujanm/DIRAC/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pujanm/DIRAC/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pujanm/DIRAC/git/refs{/sha}","trees_url":"https://api.github.com/repos/pujanm/DIRAC/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pujanm/DIRAC/statuses/{sha}","languages_url":"https://api.github.com/repos/pujanm/DIRAC/languages","stargazers_url":"https://api.github.com/repos/pujanm/DIRAC/stargazers","contributors_url":"https://api.github.com/repos/pujanm/DIRAC/contributors","subscribers_url":"https://api.github.com/repos/pujanm/DIRAC/subscribers","subscription_url":"https://api.github.com/repos/pujanm/DIRAC/subscription","commits_url":"https://api.github.com/repos/pujanm/DIRAC/commits{/sha}","git_commits_url":"https://api.github.com/repos/pujanm/DIRAC/git/commits{/sha}","comments_url":"https://api.github.com/repos/pujanm/DIRAC/comments{/number}","issue_comment_url":"https://api.github.com/repos/pujanm/DIRAC/issues/comments{/number}","contents_url":"https://api.github.com/repos/pujanm/DIRAC/contents/{+path}","compare_url":"https://api.github.com/repos/pujanm/DIRAC/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pujanm/DIRAC/merges","archive_url":"https://api.github.com/repos/pujanm/DIRAC/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pujanm/DIRAC/downloads","issues_url":"https://api.github.com/repos/pujanm/DIRAC/issues{/number}","pulls_url":"https://api.github.com/repos/pujanm/DIRAC/pulls{/number}","milestones_url":"https://api.github.com/repos/pujanm/DIRAC/milestones{/number}","notifications_url":"https://api.github.com/repos/pujanm/DIRAC/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pujanm/DIRAC/labels{/name}","releases_url":"https://api.github.com/repos/pujanm/DIRAC/releases{/id}","deployments_url":"https://api.github.com/repos/pujanm/DIRAC/deployments","created_at":"2019-05-23T13:31:27Z","updated_at":"2019-07-11T11:33:20Z","pushed_at":"2019-07-11T17:14:09Z","git_url":"git://github.com/pujanm/DIRAC.git","ssh_url":"git@github.com:pujanm/DIRAC.git","clone_url":"https://github.com/pujanm/DIRAC.git","svn_url":"https://github.com/pujanm/DIRAC","homepage":"http://diracgrid.org","size":54323,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":0,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0","node_id":"MDc6TGljZW5zZTk="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"integration"}},"base":{"label":"DIRACGrid:integration","ref":"integration","sha":"8523f2796eb6744e307205598047ea274a0bdda2","user":{"login":"DIRACGrid","id":694842,"node_id":"MDEyOk9yZ2FuaXphdGlvbjY5NDg0Mg==","avatar_url":"https://avatars0.githubusercontent.com/u/694842?v=4","gravatar_id":"","url":"https://api.github.com/users/DIRACGrid","html_url":"https://github.com/DIRACGrid","followers_url":"https://api.github.com/users/DIRACGrid/followers","following_url":"https://api.github.com/users/DIRACGrid/following{/other_user}","gists_url":"https://api.github.com/users/DIRACGrid/gists{/gist_id}","starred_url":"https://api.github.com/users/DIRACGrid/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DIRACGrid/subscriptions","organizations_url":"https://api.github.com/users/DIRACGrid/orgs","repos_url":"https://api.github.com/users/DIRACGrid/repos","events_url":"https://api.github.com/users/DIRACGrid/events{/privacy}","received_events_url":"https://api.github.com/users/DIRACGrid/received_events","type":"Organization","site_admin":false},"repo":{"id":1576831,"node_id":"MDEwOlJlcG9zaXRvcnkxNTc2ODMx","name":"DIRAC","full_name":"DIRACGrid/DIRAC","private":false,"owner":{"login":"DIRACGrid","id":694842,"node_id":"MDEyOk9yZ2FuaXphdGlvbjY5NDg0Mg==","avatar_url":"https://avatars0.githubusercontent.com/u/694842?v=4","gravatar_id":"","url":"https://api.github.com/users/DIRACGrid","html_url":"https://github.com/DIRACGrid","followers_url":"https://api.github.com/users/DIRACGrid/followers","following_url":"https://api.github.com/users/DIRACGrid/following{/other_user}","gists_url":"https://api.github.com/users/DIRACGrid/gists{/gist_id}","starred_url":"https://api.github.com/users/DIRACGrid/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DIRACGrid/subscriptions","organizations_url":"https://api.github.com/users/DIRACGrid/orgs","repos_url":"https://api.github.com/users/DIRACGrid/repos","events_url":"https://api.github.com/users/DIRACGrid/events{/privacy}","received_events_url":"https://api.github.com/users/DIRACGrid/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/DIRACGrid/DIRAC","description":"DIRAC Grid","fork":false,"url":"https://api.github.com/repos/DIRACGrid/DIRAC","forks_url":"https://api.github.com/repos/DIRACGrid/DIRAC/forks","keys_url":"https://api.github.com/repos/DIRACGrid/DIRAC/keys{/key_id}","collaborators_url":"https://api.github.com/repos/DIRACGrid/DIRAC/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/DIRACGrid/DIRAC/teams","hooks_url":"https://api.github.com/repos/DIRACGrid/DIRAC/hooks","issue_events_url":"https://api.github.com/repos/DIRACGrid/DIRAC/issues/events{/number}","events_url":"https://api.github.com/repos/DIRACGrid/DIRAC/events","assignees_url":"https://api.github.com/repos/DIRACGrid/DIRAC/assignees{/user}","branches_url":"https://api.github.com/repos/DIRACGrid/DIRAC/branches{/branch}","tags_url":"https://api.github.com/repos/DIRACGrid/DIRAC/tags","blobs_url":"https://api.github.com/repos/DIRACGrid/DIRAC/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/DIRACGrid/DIRAC/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/DIRACGrid/DIRAC/git/refs{/sha}","trees_url":"https://api.github.com/repos/DIRACGrid/DIRAC/git/trees{/sha}","statuses_url":"https://api.github.com/repos/DIRACGrid/DIRAC/statuses/{sha}","languages_url":"https://api.github.com/repos/DIRACGrid/DIRAC/languages","stargazers_url":"https://api.github.com/repos/DIRACGrid/DIRAC/stargazers","contributors_url":"https://api.github.com/repos/DIRACGrid/DIRAC/contributors","subscribers_url":"https://api.github.com/repos/DIRACGrid/DIRAC/subscribers","subscription_url":"https://api.github.com/repos/DIRACGrid/DIRAC/subscription","commits_url":"https://api.github.com/repos/DIRACGrid/DIRAC/commits{/sha}","git_commits_url":"https://api.github.com/repos/DIRACGrid/DIRAC/git/commits{/sha}","comments_url":"https://api.github.com/repos/DIRACGrid/DIRAC/comments{/number}","issue_comment_url":"https://api.github.com/repos/DIRACGrid/DIRAC/issues/comments{/number}","contents_url":"https://api.github.com/repos/DIRACGrid/DIRAC/contents/{+path}","compare_url":"https://api.github.com/repos/DIRACGrid/DIRAC/compare/{base}...{head}","merges_url":"https://api.github.com/repos/DIRACGrid/DIRAC/merges","archive_url":"https://api.github.com/repos/DIRACGrid/DIRAC/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/DIRACGrid/DIRAC/downloads","issues_url":"https://api.github.com/repos/DIRACGrid/DIRAC/issues{/number}","pulls_url":"https://api.github.com/repos/DIRACGrid/DIRAC/pulls{/number}","milestones_url":"https://api.github.com/repos/DIRACGrid/DIRAC/milestones{/number}","notifications_url":"https://api.github.com/repos/DIRACGrid/DIRAC/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/DIRACGrid/DIRAC/labels{/name}","releases_url":"https://api.github.com/repos/DIRACGrid/DIRAC/releases{/id}","deployments_url":"https://api.github.com/repos/DIRACGrid/DIRAC/deployments","created_at":"2011-04-06T11:47:53Z","updated_at":"2019-07-10T21:43:55Z","pushed_at":"2019-07-11T17:14:10Z","git_url":"git://github.com/DIRACGrid/DIRAC.git","ssh_url":"git@github.com:DIRACGrid/DIRAC.git","clone_url":"https://github.com/DIRACGrid/DIRAC.git","svn_url":"https://github.com/DIRACGrid/DIRAC","homepage":"http://diracgrid.org","size":53548,"stargazers_count":79,"watchers_count":79,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":133,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":100,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0","node_id":"MDc6TGljZW5zZTk="},"forks":133,"open_issues":100,"watchers":79,"default_branch":"integration"}},"_links":{"self":{"href":"https://api.github.com/repos/DIRACGrid/DIRAC/pulls/4120"},"html":{"href":"https://github.com/DIRACGrid/DIRAC/pull/4120"},"issue":{"href":"https://api.github.com/repos/DIRACGrid/DIRAC/issues/4120"},"comments":{"href":"https://api.github.com/repos/DIRACGrid/DIRAC/issues/4120/comments"},"review_comments":{"href":"https://api.github.com/repos/DIRACGrid/DIRAC/pulls/4120/comments"},"review_comment":{"href":"https://api.github.com/repos/DIRACGrid/DIRAC/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/DIRACGrid/DIRAC/pulls/4120/commits"},"statuses":{"href":"https://api.github.com/repos/DIRACGrid/DIRAC/statuses/8e0142a5a834838befa2a000312a3d316aec4f3e"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"zmathe"}}