{"action":"created","comment":{"url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/pulls/comments/75963316","id":75963316,"diff_hunk":"@@ -0,0 +1,349 @@\n+# Copyright (c) 2016 Intracom S.A. Telecom Solutions. All rights reserved.\n+#\n+# This program and the accompanying materials are made available under the\n+# terms of the Eclipse Public License v1.0 which accompanies this distribution,\n+# and is available at http://www.eclipse.org/legal/epl-v10.html\n+\n+\"\"\" Controller Class- All controller-related functionality is here\"\"\"\n+\n+#import collections\n+import json\n+import common\n+import logging\n+import os\n+import subprocess\n+import time\n+import util.netutil\n+import util.process\n+\n+\n+\n+class Controller:\n+\n+\n+    def __init__(self,ctrl_base_dir,test_config):\n+\n+#        logging.info('[Controller Class] Parsing test configuration')\n+#        with open(json_file) as json_conf_file:\n+#        self.test_config = json.load(json_conf_file)\n+\n+        \"\"\"Create a Controller object. Options from JSON input file\n+        :param test_config: JSON input configuration\n+        :type test_config: JSON configuration dictionary\n+        \"\"\"\n+        self.__dict__ = test_config\n+        self.name = test_config['controller_name']\n+        logging.info('Initializing parameters for the {0} Controller '.format(self.name))\n+\n+        #self.host_ip = test_config['controller_host_ip']\n+        self.node_ip = test_config['controller_node_ip']\n+        self.node_ssh_port = test_config['controller_node_ssh_port']\n+        self.node_username = test_config['controller_node_username']\n+        self.node_password = test_config['controller_password']\n+\n+        self.logs_dir = ctrl_base_dir + test_config['controller_logs_dir']\n+        self.rebuild = ctrl_base_dir + test_config['controller_rebuild']\n+        self.cleanup = ctrl_base_dir + test_config['controller_cleanup']\n+        self.port = test_config['controller_port']\n+        self.cpu_shares = test_config['controller_cpu_shares']\n+        self.logs_dir = ctrl_base_dir + test_config['controller_logs_dir']\n+\n+        self.build_handler = ctrl_base_dir + test_config['controller_build_handler']\n+        self.start_handler = ctrl_base_dir + test_config['controller_start_handler']\n+        self.stop_handler = ctrl_base_dir + test_config['controller_stop_handler']\n+        self.status_handler = ctrl_base_dir + test_config['controller_status_handler']\n+        self.clean_handler = ctrl_base_dir + test_config['controller_clean_handler']\n+\n+\n+        self.java_opts = ' '.join(test_config['java_opts'])\n+        self.cpid = -1\n+\n+        if 'controller_restconf_port' in test_config:\n+           self.restconf_port = test_config['controller_restconf_port']\n+           self.restconf_user = test_config['controller_restconf_user']\n+           self.restconf_password = test_config['controller_restconf_password']\n+\n+    def cleanup(self,ssh_client=None):\n+        \"\"\"Wrapper to the controller cleanup handler\n+\n+        :param self.clean_handler: filepath to the controller cleanup handler\n+        :param ssh_client : SSH client provided by paramiko to run the command\n+        :type self.clean_handler: str\n+        :type ssh_client: paramiko.SSHClient\n+        \"\"\"\n+        common.command_exec_wrapper([self.clean_handler],\n+                                    '[self.clean_handler]', ssh_client)\n+\n+    def check_controller_status(self,ssh_client=None):\n+        \"\"\"Wrapper to the controller status handler\n+\n+        :param self.status_handler: filepath to the controller status handler\n+        :param ssh_client : SSH client provided by paramiko to run the command\n+        :returns: '1' if controller is active, '0' otherwise\n+        :rtype: str\n+        :type self.status_handler: str\n+        :type ssh_client: paramiko.SSHClient\n+        \"\"\"\n+\n+        if ssh_client == None:\n+            return subprocess.check_output([self.status_handler],\n+                                        universal_newlines=True).strip()\n+        else:\n+            cmd_output = util.netutil.ssh_run_command(ssh_client,\n+                self.status_handler)[1]\n+            return cmd_output.strip()\n+\n+    def check_for_active_controller(self,ssh_client=None):\n+        \"\"\"Checks for processes listening on the specified port\n+\n+        :param self.port: controller port to check\n+        :param ssh_client : paramiko SSH client object when opening a connection\n+        :raises Exception: when another process listens on controller's port.\n+        :type self.port: int\n+        :type ssh_client: paramiko.SSHClient\n+        \"\"\"\n+\n+        logging.info(\n+            '[check_for_active_controller] Checking if another process is '\n+            'listening on specified port. Port number: {0}.'.\n+            format(self.port))\n+\n+        # check if any process listens on controller port\n+        gpid = util.process.getpid_listeningonport(self.port, ssh_client)\n+\n+        if gpid != -1:\n+            raise Exception('[check_for_active_controller] Another process is '\n+                            'active on port {0}'.\n+                            format(self.port))\n+\n+    def restart_controller(self,ssh_client=None):\n+        \"\"\"Restarts the controller\n+\n+        :param ssh_client : SSH client provided by paramiko to run the command\n+        :rtype: int\n+        :type ssh_client: paramiko.SSHClient\n+        \"\"\"\n+\n+        stop_controller(ssh_client)\n+        self.cpid = start_controller(controller_cpus,ssh_client)\n+\n+    def start_controller(self, controller_cpus, ssh_client=None):\n+        \"\"\"Wrapper to the controller start handler\n+\n+        :param controller_cpus: number of cpus returned by create_cpu_shares() and\n+        allocated for controller\n+        :param ssh_client : SSH client provided by paramiko to run the command\n+        :raises Exception: When controller fails to start.\n+        :rtype: int\n+        :type controller_cpus: str\n+        :type ssh_client: paramiko.SSHClient\n+        \"\"\"\n+\n+        if ssh_client==None:\n+            os.environ['JAVA_OPTS'] = self.java_opts\n+            cmd = [self.start_handler]\n+        else:\n+            cmd = ['export JAVA_OPTS=\"{0}\";'.format(self.java_opts),\n+                   'taskset', '-c', '{0}'.format(controller_cpus),\n+                   self.start_handler]\n+        logging.info('[set_java_opts] JAVA_OPTS set to {0}'.format(self.java_opts))\n+\n+        if check_controller_status(ssh_client) == '0':\n+            common.command_exec_wrapper(cmd, '[controller_start_handler]', ssh_client)\n+            logging.info(\n+                '[start_controller] Waiting until controller starts listening')\n+            self.cpid = wait_until_controller_listens(420000, ssh_client)\n+            logging.info('[start_controller] Controller pid: {0}'.format(self.cpid))\n+            logging.info(\n+                '[start_controller] Checking controller status after it starts '\n+                'listening on port {0}.'.format(self.controller_port))\n+            wait_until_controller_up_and_running(420000, ssh_client)\n+        else:\n+            logging.info('[start_controller] Controller already started.')\n+\n+\n+    def stop_controller(ssh_client=None):\n+        \"\"\"Wrapper to the controller stop handler\n+\n+        :param ssh_client : SSH client provided by paramiko to run the command\n+        :type ssh_client: paramiko.SSHClient\n+        \"\"\"\n+\n+        if check_controller_status(ssh_client) == '1':\n+            logging.info('[stop_controller] Stopping controller.')\n+            common.command_exec_wrapper(\n+                [self.stop_handler],\n+                '[controller_stop_handler]', ssh_client)\n+            util.process.wait_until_process_finishes(self.cpid, ssh_client)\n+        else:\n+            logging.info('[stop_controller] Controller already stopped.')\n+\n+\n+    def wait_until_controller_listens(interval_ms, ssh_client=None):\n+        \"\"\" Waits for controller to start listening on specified port.\n+\n+        :param interval_ms: milliseconds to wait (in milliseconds).\n+        :param ssh_client : SSH client provided by paramiko to run the command\n+        :raises Exception: If controller fails to start or if another process\n+        listens on controllers port.\n+        :rtype int\n+        :type interval_ms: int\n+        :type ssh_client: paramiko.SSHClient\n+        \"\"\"\n+\n+        timeout = time.time() + (float(interval_ms) / 1000)\n+        while time.time() < timeout:\n+            time.sleep(1)\n+            gpid = util.process.getpid_listeningonport(self.port, ssh_client)\n+            logging.info('Returned pid listening on port {0}: {1}'.\n+                          format(self.port, gpid))\n+            if gpid == 0:\n+                raise Exception('Another controller seems to have started in the '\n+                                'meantime. Exiting...')\n+\n+        raise Exception('Controller failed to start within a period of {0} '\n+                        'minutes'.format(timeout))\n+\n+\n+    def wait_until_controller_up_and_running(interval_ms, ssh_client=None):\n+        \"\"\" Waits for controller status to become 1 (started).\n+\n+        :param interval_ms: milliseconds to wait (in milliseconds).\n+        :param controller_status_handler: filepath to the controller status handler\n+        :raises Exception: If controller fails to start or if another process\n+        listens on controllers port.\n+        :type interval_ms: int\n+        :type ssh_client: paramiko.SSHClient\n+        \"\"\"\n+\n+        timeout = time.time() + (float(interval_ms) / 1000)\n+        while time.time() < timeout:\n+            time.sleep(1)\n+            if check_controller_status(ssh_client) == '1':\n+                return\n+\n+        raise Exception('Controller failed to start. '\n+                        'Status check returned 0 after trying for {0} seconds.'.\n+                        format(float(interval_ms) / 1000))\n+\n+\n+\n+class ODL(Controller):\n+    def __init__(self,ctrl_base_dir,test_config):\n+        Controller.__init__(self,test_config)\n+\n+        self.stat_period_ms = test_config['controller_statistics_period_ms']\n+\n+        if 'controller_flowmods_conf_handler' in test_config:\n+            self.flowmods_conf_handler= ctrl_base_dir + test_config['controller_flowmods_conf_handler']\n+\n+        if 'controller_statistics_handler' in test_config:\n+            self.statistics_handler = ctrl_base_dir + test_config['controller_statistics_handler']\n+\n+        if 'controller_persistent_handler' in test_config:\n+            self.persistent_handler = ctrl_base_dir + test_config['controller_persistent_handler']\n+\n+\n+    def controller_pre_actions(self, controller_ssh_client, controller_cpus):\n+        \"\"\" Performs all necessary actions before starting a test. Pre actions\n+        are 1) rebuild_controller 2) check_for_active_controller\n+        3) generate_controller_xml_files\n+\n+        :param controller_ssh_client: paramiko.SSHClient object\n+        :param controller_cpus: number of cpus returned by create_cpu_shares() and\n+        allocated for controller\n+        :type controller_ssh_client: paramiko.SSHClient\n+        :type controller_cpus: str\n+        \"\"\"\n+        if self.controller_rebuild:\n+            logging.info('[controller_pre_actions] building controller')\n+            rebuild_controller(self.build_handler, controller_ssh_client)\n+\n+        logging.info('[controller_pre_actions] checking for other active '\n+                     'controllers')\n+        check_for_active_controller(controller_ssh_client)\n+        logging.info('[controller_pre_actions] starting and stopping controller'\n+                     ' to generate xml files')\n+\n+        self.generate_controller_xml_files(controller_ssh_client, controller_cpus)\n+        if self.persistent_handler != '':\n+            change_persistent_controller(\n+                self.persistent_handler,\n+                controller_ssh_client)\n+\n+\n+    def generate_controller_xml_files(self, ssh_client, controller_cpus):\n+        \"\"\" Starts and then stops the controller to trigger the generation of\n+        controller's XML files.\n+\n+        :param ssh_client : SSH client provided by paramiko to run the command\n+        :param controller_cpus: number of cpus returned by create_cpu_shares() and\n+        allocated for controller\n+        :type ssh_client: paramiko.SSHClient\n+        :type controller_cpus: str\n+        \"\"\"\n+        logging.info('[generate_controller_xml_files] Starting controller')\n+        cpid = start_controller(controller_cpus, ssh_client)\n+\n+        # Controller status check is done within start_controller()\n+        logging.info('[generate_controller_xml_files] OK, controller status is 1.')\n+        logging.info('[generate_controller_xml_files] Stopping controller')\n+        stop_controller(ssh_client)\n+\n+\n+    def rebuild_controller(self, ssh_client=None):\n+        \"\"\" Wrapper to the controller build handler\n+\n+        :param ssh_client : SSH client provided by paramiko to run the command\n+        :type ssh_client: paramiko.SSHClient\n+        \"\"\"\n+\n+        common.command_exec_wrapper([self.build_handler],\n+                             '[controller_build_handler]', ssh_client)\n+\n+\n+    def change_persistent_controller(controller_change_persistent_handler,","path":"stress_test/controller.py","position":305,"original_position":305,"commit_id":"a7a29b0c953a9dbbde3f8e5218eec712a8123b32","original_commit_id":"a7a29b0c953a9dbbde3f8e5218eec712a8123b32","user":{"login":"anastop","id":7732969,"avatar_url":"https://avatars.githubusercontent.com/u/7732969?v=3","gravatar_id":"","url":"https://api.github.com/users/anastop","html_url":"https://github.com/anastop","followers_url":"https://api.github.com/users/anastop/followers","following_url":"https://api.github.com/users/anastop/following{/other_user}","gists_url":"https://api.github.com/users/anastop/gists{/gist_id}","starred_url":"https://api.github.com/users/anastop/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/anastop/subscriptions","organizations_url":"https://api.github.com/users/anastop/orgs","repos_url":"https://api.github.com/users/anastop/repos","events_url":"https://api.github.com/users/anastop/events{/privacy}","received_events_url":"https://api.github.com/users/anastop/received_events","type":"User","site_admin":false},"body":"rename to `disable_persistence` (to be clear)","created_at":"2016-08-23T22:26:37Z","updated_at":"2016-08-23T22:26:37Z","html_url":"https://github.com/intracom-telecom-sdn/nstat/pull/20#discussion_r75963316","pull_request_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/pulls/20","_links":{"self":{"href":"https://api.github.com/repos/intracom-telecom-sdn/nstat/pulls/comments/75963316"},"html":{"href":"https://github.com/intracom-telecom-sdn/nstat/pull/20#discussion_r75963316"},"pull_request":{"href":"https://api.github.com/repos/intracom-telecom-sdn/nstat/pulls/20"}}},"pull_request":{"url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/pulls/20","id":82334144,"html_url":"https://github.com/intracom-telecom-sdn/nstat/pull/20","diff_url":"https://github.com/intracom-telecom-sdn/nstat/pull/20.diff","patch_url":"https://github.com/intracom-telecom-sdn/nstat/pull/20.patch","issue_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/issues/20","number":20,"state":"open","locked":false,"title":"Develop controller refactor","user":{"login":"tomsou","id":20339948,"avatar_url":"https://avatars.githubusercontent.com/u/20339948?v=3","gravatar_id":"","url":"https://api.github.com/users/tomsou","html_url":"https://github.com/tomsou","followers_url":"https://api.github.com/users/tomsou/followers","following_url":"https://api.github.com/users/tomsou/following{/other_user}","gists_url":"https://api.github.com/users/tomsou/gists{/gist_id}","starred_url":"https://api.github.com/users/tomsou/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tomsou/subscriptions","organizations_url":"https://api.github.com/users/tomsou/orgs","repos_url":"https://api.github.com/users/tomsou/repos","events_url":"https://api.github.com/users/tomsou/events{/privacy}","received_events_url":"https://api.github.com/users/tomsou/received_events","type":"User","site_admin":false},"body":"controller.py added","created_at":"2016-08-23T09:47:31Z","updated_at":"2016-08-23T22:26:37Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f2ec4fe4df3812d3e05519ccf0c218673648ac45","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/pulls/20/commits","review_comments_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/pulls/20/comments","review_comment_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/pulls/comments{/number}","comments_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/issues/20/comments","statuses_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/statuses/a7a29b0c953a9dbbde3f8e5218eec712a8123b32","head":{"label":"intracom-telecom-sdn:develop_controller_refactor","ref":"develop_controller_refactor","sha":"a7a29b0c953a9dbbde3f8e5218eec712a8123b32","user":{"login":"intracom-telecom-sdn","id":12152028,"avatar_url":"https://avatars.githubusercontent.com/u/12152028?v=3","gravatar_id":"","url":"https://api.github.com/users/intracom-telecom-sdn","html_url":"https://github.com/intracom-telecom-sdn","followers_url":"https://api.github.com/users/intracom-telecom-sdn/followers","following_url":"https://api.github.com/users/intracom-telecom-sdn/following{/other_user}","gists_url":"https://api.github.com/users/intracom-telecom-sdn/gists{/gist_id}","starred_url":"https://api.github.com/users/intracom-telecom-sdn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/intracom-telecom-sdn/subscriptions","organizations_url":"https://api.github.com/users/intracom-telecom-sdn/orgs","repos_url":"https://api.github.com/users/intracom-telecom-sdn/repos","events_url":"https://api.github.com/users/intracom-telecom-sdn/events{/privacy}","received_events_url":"https://api.github.com/users/intracom-telecom-sdn/received_events","type":"Organization","site_admin":false},"repo":{"id":34813478,"name":"nstat","full_name":"intracom-telecom-sdn/nstat","owner":{"login":"intracom-telecom-sdn","id":12152028,"avatar_url":"https://avatars.githubusercontent.com/u/12152028?v=3","gravatar_id":"","url":"https://api.github.com/users/intracom-telecom-sdn","html_url":"https://github.com/intracom-telecom-sdn","followers_url":"https://api.github.com/users/intracom-telecom-sdn/followers","following_url":"https://api.github.com/users/intracom-telecom-sdn/following{/other_user}","gists_url":"https://api.github.com/users/intracom-telecom-sdn/gists{/gist_id}","starred_url":"https://api.github.com/users/intracom-telecom-sdn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/intracom-telecom-sdn/subscriptions","organizations_url":"https://api.github.com/users/intracom-telecom-sdn/orgs","repos_url":"https://api.github.com/users/intracom-telecom-sdn/repos","events_url":"https://api.github.com/users/intracom-telecom-sdn/events{/privacy}","received_events_url":"https://api.github.com/users/intracom-telecom-sdn/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/intracom-telecom-sdn/nstat","description":"Network Stress-Test Automation Toolkit","fork":false,"url":"https://api.github.com/repos/intracom-telecom-sdn/nstat","forks_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/forks","keys_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/keys{/key_id}","collaborators_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/teams","hooks_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/hooks","issue_events_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/issues/events{/number}","events_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/events","assignees_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/assignees{/user}","branches_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/branches{/branch}","tags_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/tags","blobs_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/git/refs{/sha}","trees_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/git/trees{/sha}","statuses_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/statuses/{sha}","languages_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/languages","stargazers_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/stargazers","contributors_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/contributors","subscribers_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/subscribers","subscription_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/subscription","commits_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/commits{/sha}","git_commits_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/git/commits{/sha}","comments_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/comments{/number}","issue_comment_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/issues/comments{/number}","contents_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/contents/{+path}","compare_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/compare/{base}...{head}","merges_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/merges","archive_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/downloads","issues_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/issues{/number}","pulls_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/pulls{/number}","milestones_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/milestones{/number}","notifications_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/labels{/name}","releases_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/releases{/id}","deployments_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/deployments","created_at":"2015-04-29T19:18:48Z","updated_at":"2016-05-02T20:07:48Z","pushed_at":"2016-08-23T13:28:20Z","git_url":"git://github.com/intracom-telecom-sdn/nstat.git","ssh_url":"git@github.com:intracom-telecom-sdn/nstat.git","clone_url":"https://github.com/intracom-telecom-sdn/nstat.git","svn_url":"https://github.com/intracom-telecom-sdn/nstat","homepage":"","size":9992,"stargazers_count":4,"watchers_count":4,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":6,"forks":1,"open_issues":6,"watchers":4,"default_branch":"master"}},"base":{"label":"intracom-telecom-sdn:master","ref":"master","sha":"fa9b2c8a85a0d0b6755ea639d304bfb5f709950e","user":{"login":"intracom-telecom-sdn","id":12152028,"avatar_url":"https://avatars.githubusercontent.com/u/12152028?v=3","gravatar_id":"","url":"https://api.github.com/users/intracom-telecom-sdn","html_url":"https://github.com/intracom-telecom-sdn","followers_url":"https://api.github.com/users/intracom-telecom-sdn/followers","following_url":"https://api.github.com/users/intracom-telecom-sdn/following{/other_user}","gists_url":"https://api.github.com/users/intracom-telecom-sdn/gists{/gist_id}","starred_url":"https://api.github.com/users/intracom-telecom-sdn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/intracom-telecom-sdn/subscriptions","organizations_url":"https://api.github.com/users/intracom-telecom-sdn/orgs","repos_url":"https://api.github.com/users/intracom-telecom-sdn/repos","events_url":"https://api.github.com/users/intracom-telecom-sdn/events{/privacy}","received_events_url":"https://api.github.com/users/intracom-telecom-sdn/received_events","type":"Organization","site_admin":false},"repo":{"id":34813478,"name":"nstat","full_name":"intracom-telecom-sdn/nstat","owner":{"login":"intracom-telecom-sdn","id":12152028,"avatar_url":"https://avatars.githubusercontent.com/u/12152028?v=3","gravatar_id":"","url":"https://api.github.com/users/intracom-telecom-sdn","html_url":"https://github.com/intracom-telecom-sdn","followers_url":"https://api.github.com/users/intracom-telecom-sdn/followers","following_url":"https://api.github.com/users/intracom-telecom-sdn/following{/other_user}","gists_url":"https://api.github.com/users/intracom-telecom-sdn/gists{/gist_id}","starred_url":"https://api.github.com/users/intracom-telecom-sdn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/intracom-telecom-sdn/subscriptions","organizations_url":"https://api.github.com/users/intracom-telecom-sdn/orgs","repos_url":"https://api.github.com/users/intracom-telecom-sdn/repos","events_url":"https://api.github.com/users/intracom-telecom-sdn/events{/privacy}","received_events_url":"https://api.github.com/users/intracom-telecom-sdn/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/intracom-telecom-sdn/nstat","description":"Network Stress-Test Automation Toolkit","fork":false,"url":"https://api.github.com/repos/intracom-telecom-sdn/nstat","forks_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/forks","keys_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/keys{/key_id}","collaborators_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/teams","hooks_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/hooks","issue_events_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/issues/events{/number}","events_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/events","assignees_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/assignees{/user}","branches_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/branches{/branch}","tags_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/tags","blobs_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/git/refs{/sha}","trees_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/git/trees{/sha}","statuses_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/statuses/{sha}","languages_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/languages","stargazers_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/stargazers","contributors_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/contributors","subscribers_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/subscribers","subscription_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/subscription","commits_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/commits{/sha}","git_commits_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/git/commits{/sha}","comments_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/comments{/number}","issue_comment_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/issues/comments{/number}","contents_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/contents/{+path}","compare_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/compare/{base}...{head}","merges_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/merges","archive_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/downloads","issues_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/issues{/number}","pulls_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/pulls{/number}","milestones_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/milestones{/number}","notifications_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/labels{/name}","releases_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/releases{/id}","deployments_url":"https://api.github.com/repos/intracom-telecom-sdn/nstat/deployments","created_at":"2015-04-29T19:18:48Z","updated_at":"2016-05-02T20:07:48Z","pushed_at":"2016-08-23T13:28:20Z","git_url":"git://github.com/intracom-telecom-sdn/nstat.git","ssh_url":"git@github.com:intracom-telecom-sdn/nstat.git","clone_url":"https://github.com/intracom-telecom-sdn/nstat.git","svn_url":"https://github.com/intracom-telecom-sdn/nstat","homepage":"","size":9992,"stargazers_count":4,"watchers_count":4,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":6,"forks":1,"open_issues":6,"watchers":4,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/intracom-telecom-sdn/nstat/pulls/20"},"html":{"href":"https://github.com/intracom-telecom-sdn/nstat/pull/20"},"issue":{"href":"https://api.github.com/repos/intracom-telecom-sdn/nstat/issues/20"},"comments":{"href":"https://api.github.com/repos/intracom-telecom-sdn/nstat/issues/20/comments"},"review_comments":{"href":"https://api.github.com/repos/intracom-telecom-sdn/nstat/pulls/20/comments"},"review_comment":{"href":"https://api.github.com/repos/intracom-telecom-sdn/nstat/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/intracom-telecom-sdn/nstat/pulls/20/commits"},"statuses":{"href":"https://api.github.com/repos/intracom-telecom-sdn/nstat/statuses/a7a29b0c953a9dbbde3f8e5218eec712a8123b32"}}}}
{"actor":{"display_login":"anastop"}}