{"action":"created","comment":{"url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/pulls/comments/177746914","pull_request_review_id":107674147,"id":177746914,"diff_hunk":"@@ -0,0 +1,327 @@\n+#  Copyright 2018 SAS Project Authors. All Rights Reserved.\n+#\n+#  Licensed under the Apache License, Version 2.0 (the \"License\");\n+#  you may not use this file except in compliance with the License.\n+#  You may obtain a copy of the License at\n+#\n+#    http://www.apache.org/licenses/LICENSE-2.0\n+#\n+#  Unless required by applicable law or agreed to in writing, software\n+#  distributed under the License is distributed on an \"AS IS\" BASIS,\n+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+#  See the License for the specific language governing permissions and\n+#  limitations under the License.\n+\n+\"\"\"Implementation of multiple objects (Grant, Cbsd and DomainProxy).\n+   Mainly used in MCP and related test cases.\"\"\"\n+from enum import Enum\n+import logging\n+\n+class Grant(object):\n+  \"\"\"Holds the Grant request parameters.\"\"\"\n+\n+  # Define an enumeration class named ResponseCodes with members\n+  # 'SUCCESS',TERMINATED_GRANT', 'SUSPENDED_GRANT'\n+  class ResponseCodes(Enum):\n+    SUCCESS = 0\n+    TERMINATED_GRANT = 500\n+    SUSPENDED_GRANT = 501\n+\n+  def __init__(self, grant_id, grant_request):\n+    \"\"\"Store grant parameters and initialize state variables.\n+\n+    Args:\n+      grant_id: grant id of the request.\n+      grant_request: A dictionary containing the grant request parameters.\n+    \"\"\"\n+    # Store the grant parameters\n+    self.grant_id = grant_id\n+    self.grant_request = grant_request\n+    self.authorized_in_last_heartbeat = False\n+    self.is_terminated = False\n+\n+  def getGrantId(self):\n+    return self.grant_id\n+\n+  def getGrantRequest(self):\n+    return self.grant_request\n+\n+  def getRequestOperationParam(self):\n+      return self.grant_request['operationParam']\n+\n+  def constructHeartbeatRequest(self):\n+    \"\"\"Constructs heartbeat request for the grant object.\"\"\"\n+    heartbeat_request = {\n+        'grantId': self.grant_id,\n+        'cbsdId': self.grant_request['cbsdId'],\n+        'operationState': 'GRANTED'\n+      }\n+    return heartbeat_request\n+\n+  def isGrantAuthorizedInLastHeartbeat(self):\n+    return self.authorized_in_last_heartbeat\n+\n+  def isActive(self):\n+    return not self.is_terminated\n+\n+\n+class Cbsd(object):\n+  \"\"\"Holds the CBSD related parameters.\"\"\"\n+\n+  def __init__(self, cbsd_id, registration_request, grant_ids, grant_requests):\n+    \"\"\"Constructor to store the registration request parameters.\n+\n+    Args:\n+      cbsd_id: cbsd id of the device extracted from the registration response.\n+      registration_request:A registrationRequest object as defined in the SAS-CBSD TS.\n+      grant_ids: list of grant ids.\n+      grant_requests:A list of dictionary containing the grant request parameters.\n+    \"\"\"\n+    assert len(grant_requests) == len(grant_ids)\n+    self.cbsd_id = cbsd_id\n+    self.grant_objects = {}\n+    for grant_id, grant_request in zip(grant_ids, grant_requests):\n+      self.grant_objects[grant_id] = Grant(grant_id, grant_request)\n+    self.registration_request = registration_request\n+\n+  def getCbsdId(self):\n+    return self.cbsd_id\n+\n+  def getGrantObject(self, grant_id):\n+      return self.grant_objects[grant_id]\n+\n+  def getRegistrationRequest(self):\n+    return self.registration_request\n+\n+  def hasActiveGrant(self):\n+    for grant_object in self.grant_objects.itervalues():\n+      if grant_object.isActive():\n+        return True\n+    return False\n+\n+  def hasAuthorizedGrant(self):\n+    for grant_object in self.grant_objects.itervalues():\n+      if grant_object.isGrantAuthorizedInLastHeartbeat():\n+        return True\n+    return False\n+\n+  def constructHeartbeatRequestForAllActiveGrants(self):\n+    \"\"\"Construct list of heartbeat requests of all active grants.\"\"\"\n+    heartbeat_requests = []\n+    for grant_object in self.grant_objects.itervalues():\n+      if grant_object.isActive():\n+        heartbeat_requests.append(grant_object.constructHeartbeatRequest())\n+    return heartbeat_requests\n+\n+  def getOperationParamsOfAllAuthorizedGrants(self):\n+    \"\"\"Returns the list of operation params of all authorized grants.\"\"\"\n+    operation_params = []\n+    for grant_object in self.grant_objects.itervalues():\n+      if grant_object.isGrantAuthorizedInLastHeartbeat():\n+        operation_params.append(grant_object.getRequestOperationParam())\n+    return operation_params\n+\n+\n+class DomainProxy(object):\n+  \"\"\"Performs Domain Proxy related operations.\n+\n+  This class stores Domain Proxy related information like the SSL certificate, key to be used and the set of\n+  CBSD objects belonging to this Domain Proxy. Bulk operations like registration, grant and heartbeat\n+  procedures are performed on all of the CBSDs belonging to this Domain Proxy.\n+  \"\"\"\n+  # Define an enumeration class named ResponseCodes with members\n+  # 'SUCCESS'\n+  class RelinquishmentResponseCodes(Enum):\n+    SUCCESS = 0\n+\n+  def __init__(self, ssl_cert, ssl_key, testcase):\n+    \"\"\"\n+    Args:\n+      ssl_cert: Path to SSL cert file.\n+      ssl_key: Path to SSL key file.\n+      testcase: test case object from the caller.\n+    \"\"\"\n+    self.ssl_cert = ssl_cert\n+    self.ssl_key = ssl_key\n+    self.cbsd_objects = {}\n+    self.testcase = testcase\n+\n+  def addCbsdsAndGrants(self, registration_requests, grant_requests):\n+    \"\"\"Construct CBSD object based on the result of registration and\n+    grant requests.\n+\n+    Args\n+      registration_requests: A list of dictionary elements ,where each list elements is\n+        individual CBSD registration requests (each of which is itself a dictionary).\n+      grant_requests: A list of dictionary elements,where each list elements is\n+        individual CBSD grant requests (each of which is itself a dictionary).\n+    \"\"\"\n+    # Checking if the number of registration requests matches number of grant requests.\n+    # There should be exactly one grant request per registration request.\n+    assert len(grant_requests) == len(registration_requests)\n+    cbsd_ids = self.testcase.assertRegistered(registration_requests,\n+                                              cert=self.ssl_cert, key=self.ssl_key)\n+\n+    # Copy the cbsdId from Registration response to grant requests.\n+    for index, grant_request in enumerate(grant_requests):\n+      grant_request['cbsdId'] = cbsd_ids[index]\n+\n+    # Wrapped version of the grant requests.\n+    grant_requests_wrap = {\n+      'grantRequest': grant_requests\n+    }\n+\n+    #perform grant operation.\n+    grant_responses = self.testcase._sas.Grant(grant_requests_wrap,\n+                                               self.ssl_cert, self.ssl_key)['grantResponse']\n+\n+    # Make one CBSD object per successful grant request.\n+    for index, grant_request in enumerate(grant_requests):\n+      if grant_responses[index]['response']['responseCode'] == Grant.ResponseCodes.SUCCESS.value:\n+        cbsd_object = Cbsd(cbsd_ids[index], registration_requests[index],\n+                           [grant_responses[index]['grantId']], [grant_request])\n+        self.cbsd_objects[cbsd_ids[index]] = cbsd_object\n+\n+  def getCbsdObjectById(self, cbsd_id):\n+      return self.cbsd_objects[cbsd_id]\n+\n+  def heartbeatForAllActiveGrants(self):\n+    \"\"\"Performs heartbeat request for all grants of CBSD devices at once.\n+\n+    Returns:\n+      heartbeat_requests : list of heartbeat requests which are constructed for all the grants\n+      by the caller.\n+      heartbeat_responses: list of heartbeat response.\n+    \"\"\"\n+    # Concatenate all the heartbeat request of CBSD into single request.\n+    heartbeat_requests = []\n+    for cbsd_object_item in self.cbsd_objects.values():\n+      heartbeat_requests.extend(cbsd_object_item.constructHeartbeatRequestForAllActiveGrants())\n+\n+    if len(heartbeat_requests):\n+      heartbeat_requests_wrapped = {\n+        'heartbeatRequest': heartbeat_requests\n+      }\n+      # Perform heartbeat requests.\n+      heartbeat_responses = self.testcase._sas.Heartbeat(\n+        heartbeat_requests_wrapped, self.ssl_cert, self.ssl_key)['heartbeatResponse']\n+\n+      for heartbeat_response in heartbeat_responses:\n+        cbsd_object = self.cbsd_objects[heartbeat_response['cbsdId']]\n+        grant_object = cbsd_object.grant_objects[heartbeat_response['grantId']]\n+\n+        # Update grant state based on the heartbeat response.\n+        self._mapResponseCodeToGrantState(heartbeat_response['response']['responseCode'],\n+                                         grant_object)\n+\n+      return heartbeat_requests, heartbeat_responses\n+\n+  def _mapResponseCodeToGrantState(self, heartbeat_response_code, grant_object):\n+    \"\"\"Maps the heartbeat response and update the grant state.\"\"\"\n+    if heartbeat_response_code == Grant.ResponseCodes.SUCCESS.value:\n+      grant_object.authorized_in_last_heartbeat = True\n+    elif heartbeat_response_code == Grant.ResponseCodes.TERMINATED_GRANT.value:\n+      grant_object.is_terminated = True\n+    elif heartbeat_response_code == Grant.ResponseCodes.SUSPENDED_GRANT.value:\n+      grant_object.authorized_in_last_heartbeat = False\n+    else:\n+      logging.error('Unknown code=%s received in Heartbeat Response',heartbeat_response_code)\n+      raise Exception('Unknown code received in Heartbeat Response')\n+\n+  def _constructGrantRequest(self,heartbeat_response):\n+    \"\"\"Construct unwrapped version of grant request.\"\"\"\n+    grant_request = {\n+      'cbsdId': heartbeat_response['cbsdId'],\n+      'operationParam': {\n+        'maxEirp': heartbeat_response['operationParam']['maxEirp'],\n+        'operationFrequencyRange': {\n+          'lowFrequency': heartbeat_response['operationParam']['operationFrequencyRange']['lowFrequency'],\n+          'highFrequency': heartbeat_response['operationParam']['operationFrequencyRange']['highFrequency']\n+        }\n+      }\n+    }\n+    return grant_request\n+\n+  def performHeartbeatAndUpdateGrants(self):\n+    \"\"\"Does heartbeat request for all active grants and updates the grants.\n+\n+    The following steps are performed by this function\n+      1. Send heartbeat request on all grant of CBSD at once\n+      2. If the heartbeat response contains operationParam then those grants\n+         are relinquished.\n+      3. New grant requests with the suggested operationParam values in the\n+         heartbeat response is sent. Failures are ignored.\n+      4. Heartbeat is performed again for all grants. Failures are ignored.\n+    \"\"\"\n+    # Heartbeat on all active grants\n+    heartbeat_requests = []\n+    heartbeat_requests, heartbeat_responses = self.heartbeatForAllActiveGrants()\n+    relinquishment_requests = []\n+    grant_requests = []\n+\n+    # Construct relinquishment and grant for the heart beat response which have operation param.\n+    for heartbeat_response, heartbeat_request in zip(heartbeat_responses, heartbeat_requests):\n+        if heartbeat_response['response']['responseCode'] == Grant.ResponseCodes.TERMINATED_GRANT.value:\n+           if 'operationParam' in heartbeat_response:\n+             # Construct grant request for Terminated grants\n+             grant_requests.append(self._constructGrantRequest(heartbeat_response))\n+           else:\n+             logging.error('Invalid Response since operation param not present in case of Terminated Grant')\n+\n+        elif heartbeat_response['response']['responseCode'] == Grant.ResponseCodes.SUSPENDED_GRANT.value:\n+          # If any heartbeat contain suggested operation params,construct relinquishment requests.\n+          if 'operationParam' in heartbeat_response:\n+            relinquishment_request = {\n+                'cbsdId': heartbeat_response['cbsdId'],\n+                'grantId': heartbeat_response['grantId']\n+            }\n+            relinquishment_requests.append(relinquishment_request)\n+\n+            # Construct grant request for relinquished grants\n+            grant_requests.append(self._constructGrantRequest(heartbeat_request))\n+\n+            # Delete the grant object\n+            del self.cbsd_objects[heartbeat_response['cbsdId']].grant_objects[heartbeat_response['grantId']]","path":"src/harness/test_harness_objects.py","position":277,"original_position":284,"commit_id":"acc0d532202f88919ae69b41efd3ecf14bd4b88d","original_commit_id":"8c35a3e2fb44e308d516e054645364e9fa2c02ea","user":{"login":"jni2000","id":11164076,"avatar_url":"https://avatars1.githubusercontent.com/u/11164076?v=4","gravatar_id":"","url":"https://api.github.com/users/jni2000","html_url":"https://github.com/jni2000","followers_url":"https://api.github.com/users/jni2000/followers","following_url":"https://api.github.com/users/jni2000/following{/other_user}","gists_url":"https://api.github.com/users/jni2000/gists{/gist_id}","starred_url":"https://api.github.com/users/jni2000/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jni2000/subscriptions","organizations_url":"https://api.github.com/users/jni2000/orgs","repos_url":"https://api.github.com/users/jni2000/repos","events_url":"https://api.github.com/users/jni2000/events{/privacy}","received_events_url":"https://api.github.com/users/jni2000/received_events","type":"User","site_admin":false},"body":"Thanks for pointing out \r\ngrant object will be deleted in case of terminated grant also.","created_at":"2018-03-28T13:22:33Z","updated_at":"2018-03-28T13:22:34Z","html_url":"https://github.com/Wireless-Innovation-Forum/Spectrum-Access-System/pull/404#discussion_r177746914","pull_request_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/pulls/404","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/pulls/comments/177746914"},"html":{"href":"https://github.com/Wireless-Innovation-Forum/Spectrum-Access-System/pull/404#discussion_r177746914"},"pull_request":{"href":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/pulls/404"}},"in_reply_to_id":177495942},"pull_request":{"url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/pulls/404","id":165166954,"html_url":"https://github.com/Wireless-Innovation-Forum/Spectrum-Access-System/pull/404","diff_url":"https://github.com/Wireless-Innovation-Forum/Spectrum-Access-System/pull/404.diff","patch_url":"https://github.com/Wireless-Innovation-Forum/Spectrum-Access-System/pull/404.patch","issue_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/issues/404","number":404,"state":"open","locked":false,"title":"Federated Wireless delivered the following key objects: CBSD, Grant, …","user":{"login":"jni2000","id":11164076,"avatar_url":"https://avatars1.githubusercontent.com/u/11164076?v=4","gravatar_id":"","url":"https://api.github.com/users/jni2000","html_url":"https://github.com/jni2000","followers_url":"https://api.github.com/users/jni2000/followers","following_url":"https://api.github.com/users/jni2000/following{/other_user}","gists_url":"https://api.github.com/users/jni2000/gists{/gist_id}","starred_url":"https://api.github.com/users/jni2000/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jni2000/subscriptions","organizations_url":"https://api.github.com/users/jni2000/orgs","repos_url":"https://api.github.com/users/jni2000/repos","events_url":"https://api.github.com/users/jni2000/events{/privacy}","received_events_url":"https://api.github.com/users/jni2000/received_events","type":"User","site_admin":false},"body":"Federated Wireless delivered the following key objects: CBSD, Grant and Domain Proxy. Please review. These objects are developed per earlier weekly review and discussion for setting up some common utility objects that can be used in other test cases. Please review.","created_at":"2018-01-25T16:34:21Z","updated_at":"2018-03-28T13:22:34Z","closed_at":null,"merged_at":null,"merge_commit_sha":"28212a08f00a34ebeed9cb47f9749bb685df1d39","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":690620624,"url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/labels/needs%20reviewer","name":"needs reviewer","color":"5319e7","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/pulls/404/commits","review_comments_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/pulls/404/comments","review_comment_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/issues/404/comments","statuses_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/statuses/acc0d532202f88919ae69b41efd3ecf14bd4b88d","head":{"label":"Wireless-Innovation-Forum:fwKeyObjects","ref":"fwKeyObjects","sha":"acc0d532202f88919ae69b41efd3ecf14bd4b88d","user":{"login":"Wireless-Innovation-Forum","id":10857009,"avatar_url":"https://avatars0.githubusercontent.com/u/10857009?v=4","gravatar_id":"","url":"https://api.github.com/users/Wireless-Innovation-Forum","html_url":"https://github.com/Wireless-Innovation-Forum","followers_url":"https://api.github.com/users/Wireless-Innovation-Forum/followers","following_url":"https://api.github.com/users/Wireless-Innovation-Forum/following{/other_user}","gists_url":"https://api.github.com/users/Wireless-Innovation-Forum/gists{/gist_id}","starred_url":"https://api.github.com/users/Wireless-Innovation-Forum/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Wireless-Innovation-Forum/subscriptions","organizations_url":"https://api.github.com/users/Wireless-Innovation-Forum/orgs","repos_url":"https://api.github.com/users/Wireless-Innovation-Forum/repos","events_url":"https://api.github.com/users/Wireless-Innovation-Forum/events{/privacy}","received_events_url":"https://api.github.com/users/Wireless-Innovation-Forum/received_events","type":"Organization","site_admin":false},"repo":{"id":38059331,"name":"Spectrum-Access-System","full_name":"Wireless-Innovation-Forum/Spectrum-Access-System","owner":{"login":"Wireless-Innovation-Forum","id":10857009,"avatar_url":"https://avatars0.githubusercontent.com/u/10857009?v=4","gravatar_id":"","url":"https://api.github.com/users/Wireless-Innovation-Forum","html_url":"https://github.com/Wireless-Innovation-Forum","followers_url":"https://api.github.com/users/Wireless-Innovation-Forum/followers","following_url":"https://api.github.com/users/Wireless-Innovation-Forum/following{/other_user}","gists_url":"https://api.github.com/users/Wireless-Innovation-Forum/gists{/gist_id}","starred_url":"https://api.github.com/users/Wireless-Innovation-Forum/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Wireless-Innovation-Forum/subscriptions","organizations_url":"https://api.github.com/users/Wireless-Innovation-Forum/orgs","repos_url":"https://api.github.com/users/Wireless-Innovation-Forum/repos","events_url":"https://api.github.com/users/Wireless-Innovation-Forum/events{/privacy}","received_events_url":"https://api.github.com/users/Wireless-Innovation-Forum/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Wireless-Innovation-Forum/Spectrum-Access-System","description":"Spectrum Access System Testing and Interoperability Repository","fork":false,"url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System","forks_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/forks","keys_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/teams","hooks_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/hooks","issue_events_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/issues/events{/number}","events_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/events","assignees_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/assignees{/user}","branches_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/branches{/branch}","tags_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/tags","blobs_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/git/refs{/sha}","trees_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/statuses/{sha}","languages_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/languages","stargazers_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/stargazers","contributors_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/contributors","subscribers_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/subscribers","subscription_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/subscription","commits_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/commits{/sha}","git_commits_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/git/commits{/sha}","comments_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/comments{/number}","issue_comment_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/issues/comments{/number}","contents_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/contents/{+path}","compare_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/merges","archive_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/downloads","issues_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/issues{/number}","pulls_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/pulls{/number}","milestones_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/milestones{/number}","notifications_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/labels{/name}","releases_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/releases{/id}","deployments_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/deployments","created_at":"2015-06-25T16:00:15Z","updated_at":"2018-03-27T21:43:47Z","pushed_at":"2018-03-28T13:16:52Z","git_url":"git://github.com/Wireless-Innovation-Forum/Spectrum-Access-System.git","ssh_url":"git@github.com:Wireless-Innovation-Forum/Spectrum-Access-System.git","clone_url":"https://github.com/Wireless-Innovation-Forum/Spectrum-Access-System.git","svn_url":"https://github.com/Wireless-Innovation-Forum/Spectrum-Access-System","homepage":"http://www.wirelessinnovation.org/ssc","size":542779,"stargazers_count":26,"watchers_count":26,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":24,"mirror_url":null,"archived":false,"open_issues_count":28,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":24,"open_issues":28,"watchers":26,"default_branch":"master"}},"base":{"label":"Wireless-Innovation-Forum:master","ref":"master","sha":"5959dd24c841c8fe09a149c7d3f13184326d6411","user":{"login":"Wireless-Innovation-Forum","id":10857009,"avatar_url":"https://avatars0.githubusercontent.com/u/10857009?v=4","gravatar_id":"","url":"https://api.github.com/users/Wireless-Innovation-Forum","html_url":"https://github.com/Wireless-Innovation-Forum","followers_url":"https://api.github.com/users/Wireless-Innovation-Forum/followers","following_url":"https://api.github.com/users/Wireless-Innovation-Forum/following{/other_user}","gists_url":"https://api.github.com/users/Wireless-Innovation-Forum/gists{/gist_id}","starred_url":"https://api.github.com/users/Wireless-Innovation-Forum/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Wireless-Innovation-Forum/subscriptions","organizations_url":"https://api.github.com/users/Wireless-Innovation-Forum/orgs","repos_url":"https://api.github.com/users/Wireless-Innovation-Forum/repos","events_url":"https://api.github.com/users/Wireless-Innovation-Forum/events{/privacy}","received_events_url":"https://api.github.com/users/Wireless-Innovation-Forum/received_events","type":"Organization","site_admin":false},"repo":{"id":38059331,"name":"Spectrum-Access-System","full_name":"Wireless-Innovation-Forum/Spectrum-Access-System","owner":{"login":"Wireless-Innovation-Forum","id":10857009,"avatar_url":"https://avatars0.githubusercontent.com/u/10857009?v=4","gravatar_id":"","url":"https://api.github.com/users/Wireless-Innovation-Forum","html_url":"https://github.com/Wireless-Innovation-Forum","followers_url":"https://api.github.com/users/Wireless-Innovation-Forum/followers","following_url":"https://api.github.com/users/Wireless-Innovation-Forum/following{/other_user}","gists_url":"https://api.github.com/users/Wireless-Innovation-Forum/gists{/gist_id}","starred_url":"https://api.github.com/users/Wireless-Innovation-Forum/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Wireless-Innovation-Forum/subscriptions","organizations_url":"https://api.github.com/users/Wireless-Innovation-Forum/orgs","repos_url":"https://api.github.com/users/Wireless-Innovation-Forum/repos","events_url":"https://api.github.com/users/Wireless-Innovation-Forum/events{/privacy}","received_events_url":"https://api.github.com/users/Wireless-Innovation-Forum/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Wireless-Innovation-Forum/Spectrum-Access-System","description":"Spectrum Access System Testing and Interoperability Repository","fork":false,"url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System","forks_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/forks","keys_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/teams","hooks_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/hooks","issue_events_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/issues/events{/number}","events_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/events","assignees_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/assignees{/user}","branches_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/branches{/branch}","tags_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/tags","blobs_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/git/refs{/sha}","trees_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/statuses/{sha}","languages_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/languages","stargazers_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/stargazers","contributors_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/contributors","subscribers_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/subscribers","subscription_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/subscription","commits_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/commits{/sha}","git_commits_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/git/commits{/sha}","comments_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/comments{/number}","issue_comment_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/issues/comments{/number}","contents_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/contents/{+path}","compare_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/merges","archive_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/downloads","issues_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/issues{/number}","pulls_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/pulls{/number}","milestones_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/milestones{/number}","notifications_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/labels{/name}","releases_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/releases{/id}","deployments_url":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/deployments","created_at":"2015-06-25T16:00:15Z","updated_at":"2018-03-27T21:43:47Z","pushed_at":"2018-03-28T13:16:52Z","git_url":"git://github.com/Wireless-Innovation-Forum/Spectrum-Access-System.git","ssh_url":"git@github.com:Wireless-Innovation-Forum/Spectrum-Access-System.git","clone_url":"https://github.com/Wireless-Innovation-Forum/Spectrum-Access-System.git","svn_url":"https://github.com/Wireless-Innovation-Forum/Spectrum-Access-System","homepage":"http://www.wirelessinnovation.org/ssc","size":542779,"stargazers_count":26,"watchers_count":26,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":24,"mirror_url":null,"archived":false,"open_issues_count":28,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":24,"open_issues":28,"watchers":26,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/pulls/404"},"html":{"href":"https://github.com/Wireless-Innovation-Forum/Spectrum-Access-System/pull/404"},"issue":{"href":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/issues/404"},"comments":{"href":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/issues/404/comments"},"review_comments":{"href":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/pulls/404/comments"},"review_comment":{"href":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/pulls/404/commits"},"statuses":{"href":"https://api.github.com/repos/Wireless-Innovation-Forum/Spectrum-Access-System/statuses/acc0d532202f88919ae69b41efd3ecf14bd4b88d"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"jni2000"}}