{"action":"created","comment":{"url":"https://api.github.com/repos/apache/incubator-trafficcontrol/pulls/comments/190374794","pull_request_review_id":122737328,"id":190374794,"diff_hunk":"@@ -0,0 +1,326 @@\n+package deliveryservice\n+\n+/*\n+ * Licensed to the Apache Software Foundation (ASF) under one\n+ * or more contributor license agreements.  See the NOTICE file\n+ * distributed with this work for additional information\n+ * regarding copyright ownership.  The ASF licenses this file\n+ * to you under the Apache License, Version 2.0 (the\n+ * \"License\"); you may not use this file except in compliance\n+ * with the License.  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,\n+ * software distributed under the License is distributed on an\n+ * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n+ * KIND, either express or implied.  See the License for the\n+ * specific language governing permissions and limitations\n+ * under the License.\n+ */\n+\n+import (\n+\t\"database/sql\"\n+\t\"errors\"\n+\t\"fmt\"\n+\t\"regexp\"\n+\t\"strings\"\n+\n+\t\"github.com/apache/incubator-trafficcontrol/lib/go-tc\"\n+\t\"github.com/apache/incubator-trafficcontrol/lib/go-log\"\n+\t\"github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/api\"\n+\t\"github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/auth\"\n+\t\"github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/config\"\n+\t\"github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/tenant\"\n+\t\"github.com/apache/incubator-trafficcontrol/traffic_ops/traffic_ops_golang/tovalidate\"\n+\n+\t\"github.com/asaskevich/govalidator\"\n+\t\"github.com/go-ozzo/ozzo-validation\"\n+\t\"github.com/jmoiron/sqlx\"\n+)\n+\n+type TODeliveryServiceV12 struct {\n+\tDS  *tc.DeliveryServiceNullableV12\n+\tCfg config.Config\n+\tDB  *sqlx.DB\n+}\n+\n+func GetRefTypeV12(cfg config.Config, db *sqlx.DB) *TODeliveryServiceV12 {\n+\treturn &TODeliveryServiceV12{Cfg: cfg, DB: db, DS: &tc.DeliveryServiceNullableV12{}}\n+}\n+\n+func (ds TODeliveryServiceV12) GetKeyFieldsInfo() []api.KeyFieldInfo {\n+\treturn []api.KeyFieldInfo{{\"id\", api.GetIntKey}}\n+}\n+\n+func (tods TODeliveryServiceV12) GetKeys() (map[string]interface{}, bool) {\n+\tif tods.DS.ID == nil {\n+\t\treturn map[string]interface{}{\"id\": 0}, false\n+\t}\n+\treturn map[string]interface{}{\"id\": *tods.DS.ID}, true\n+}\n+\n+func (tods *TODeliveryServiceV12) SetKeys(keys map[string]interface{}) {\n+\ti, _ := keys[\"id\"].(int) //this utilizes the non panicking type assertion, if the thrown away ok variable is false i will be the zero of the type, 0 here.\n+\ttods.DS.ID = &i\n+}\n+\n+func (tods *TODeliveryServiceV12) GetAuditName() string {\n+\tif tods.DS != nil && tods.DS.XMLID != nil {\n+\t\treturn *tods.DS.XMLID\n+\t}\n+\treturn \"\"\n+}\n+\n+func (tods *TODeliveryServiceV12) GetType() string {\n+\treturn \"ds\"\n+}\n+\n+func ValidateV12(db *sqlx.DB, ds *tc.DeliveryServiceNullableV12) []error {\n+\tif ds == nil {\n+\t\treturn []error{}\n+\t}\n+\ttods := TODeliveryServiceV12{DS: ds, DB: db} // TODO pass config?\n+\treturn tods.Validate(db)\n+}\n+\n+func (tods *TODeliveryServiceV12) Sanitize(db *sqlx.DB) {\n+\tds := tods.DS\n+\tif ds.GeoLimitCountries != nil {\n+\t\t*ds.GeoLimitCountries = strings.ToUpper(strings.Replace(*ds.GeoLimitCountries, \" \", \"\", -1))\n+\t}\n+\tif ds.ProfileID != nil && *ds.ProfileID == -1 {\n+\t\tds.ProfileID = nil\n+\t}\n+\tif ds.EdgeHeaderRewrite != nil && strings.TrimSpace(*ds.EdgeHeaderRewrite) == \"\" {\n+\t\tds.EdgeHeaderRewrite = nil\n+\t}\n+\tif ds.MidHeaderRewrite != nil && strings.TrimSpace(*ds.MidHeaderRewrite) == \"\" {\n+\t\tds.MidHeaderRewrite = nil\n+\t}\n+}\n+\n+// LoadTenantID loads the DeliveryService's tenant ID from the database, using the DS ID or XMLID if either exists. Sets tods.DS.TenantID on success, and returns whether the delivery service was found, and any error.\n+func (tods *TODeliveryServiceV12) LoadTenantID(db *sqlx.DB) (bool, error) {\n+\tif tods.DS.ID != nil {\n+\t\ttenantID := 0\n+\t\tif err := db.QueryRow(`SELECT tenant_id FROM deliveryservice where id = $1`, tods.DS.ID).Scan(&tenantID); err != nil {\n+\t\t\tif err == sql.ErrNoRows {\n+\t\t\t\treturn false, nil\n+\t\t\t}\n+\t\t\treturn false, fmt.Errorf(\"querying tenant ID for delivery service ID '%v': %v\", *tods.DS.ID, err)\n+\t\t}\n+\t\ttods.DS.TenantID = &tenantID\n+\t\treturn true, nil\n+\t}\n+\tif tods.DS.XMLID != nil {\n+\t\ttenantID := 0\n+\t\tif err := db.QueryRow(`SELECT tenant_id FROM deliveryservice where xml_id = $1`, *tods.DS.XMLID).Scan(&tenantID); err != nil {\n+\t\t\tif err == sql.ErrNoRows {\n+\t\t\t\treturn false, nil\n+\t\t\t}\n+\t\t\treturn false, fmt.Errorf(\"querying tenant ID for delivery service xml_id '%v': %v\", *tods.DS.XMLID, err)\n+\t\t}\n+\t\ttods.DS.TenantID = &tenantID\n+\t\treturn true, nil\n+\t}\n+\treturn false, errors.New(\"no id or xml_id\")\n+}\n+\n+// LoadXMLID loads the DeliveryService's xml_id from the database, from the ID. Returns whether the delivery service was found, and any error.\n+func (tods *TODeliveryServiceV12) LoadXMLID(db *sqlx.DB) (bool, error) {\n+\tif tods.DS.ID == nil {\n+\t\treturn false, errors.New(\"missing ID\")\n+\t}\n+\n+\txmlID := \"\"\n+\tif err := db.QueryRow(`SELECT xml_id FROM deliveryservice where id = $1`, tods.DS.ID).Scan(&xmlID); err != nil {\n+\t\tif err == sql.ErrNoRows {\n+\t\t\treturn false, nil\n+\t\t}\n+\t\treturn false, fmt.Errorf(\"querying xml_id for delivery service ID '%v': %v\", *tods.DS.ID, err)\n+\t}\n+\ttods.DS.XMLID = &xmlID\n+\treturn true, nil\n+}\n+\n+func (tods *TODeliveryServiceV12) IsTenantAuthorized(user auth.CurrentUser, db *sqlx.DB) (bool, error) {\n+\ttods.LoadTenantID(db) // try to load, but ignore errors and keep the user-set tenant ID on failure (which will happen with a Create)","path":"traffic_ops/traffic_ops_golang/deliveryservice/deliveryservicesv12.go","position":null,"original_position":148,"commit_id":"8cc4cfaad64533751bd118a61d7acbf2ac125de6","original_commit_id":"e4c54a731bd382b56216bde594221d955f53951b","user":{"login":"rob05c","id":5113421,"avatar_url":"https://avatars3.githubusercontent.com/u/5113421?v=4","gravatar_id":"","url":"https://api.github.com/users/rob05c","html_url":"https://github.com/rob05c","followers_url":"https://api.github.com/users/rob05c/followers","following_url":"https://api.github.com/users/rob05c/following{/other_user}","gists_url":"https://api.github.com/users/rob05c/gists{/gist_id}","starred_url":"https://api.github.com/users/rob05c/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rob05c/subscriptions","organizations_url":"https://api.github.com/users/rob05c/orgs","repos_url":"https://api.github.com/users/rob05c/repos","events_url":"https://api.github.com/users/rob05c/events{/privacy}","received_events_url":"https://api.github.com/users/rob05c/received_events","type":"User","site_admin":false},"body":"Ok, I changed it to check both, return false if the user isn't authorized for either, and allow the user to change the DS's tenant if they're authorized for both.","created_at":"2018-05-23T19:40:48Z","updated_at":"2018-05-23T19:40:48Z","html_url":"https://github.com/apache/incubator-trafficcontrol/pull/2124#discussion_r190374794","pull_request_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/pulls/2124","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/apache/incubator-trafficcontrol/pulls/comments/190374794"},"html":{"href":"https://github.com/apache/incubator-trafficcontrol/pull/2124#discussion_r190374794"},"pull_request":{"href":"https://api.github.com/repos/apache/incubator-trafficcontrol/pulls/2124"}},"in_reply_to_id":186202885},"pull_request":{"url":"https://api.github.com/repos/apache/incubator-trafficcontrol/pulls/2124","id":181044560,"html_url":"https://github.com/apache/incubator-trafficcontrol/pull/2124","diff_url":"https://github.com/apache/incubator-trafficcontrol/pull/2124.diff","patch_url":"https://github.com/apache/incubator-trafficcontrol/pull/2124.patch","issue_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/issues/2124","number":2124,"state":"open","locked":false,"title":"Add TO Go deliveryservices routes","user":{"login":"rob05c","id":5113421,"avatar_url":"https://avatars3.githubusercontent.com/u/5113421?v=4","gravatar_id":"","url":"https://api.github.com/users/rob05c","html_url":"https://github.com/rob05c","followers_url":"https://api.github.com/users/rob05c/followers","following_url":"https://api.github.com/users/rob05c/following{/other_user}","gists_url":"https://api.github.com/users/rob05c/gists{/gist_id}","starred_url":"https://api.github.com/users/rob05c/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rob05c/subscriptions","organizations_url":"https://api.github.com/users/rob05c/orgs","repos_url":"https://api.github.com/users/rob05c/repos","events_url":"https://api.github.com/users/rob05c/events{/privacy}","received_events_url":"https://api.github.com/users/rob05c/received_events","type":"User","site_admin":false},"body":"Also versions the deliveryservice structs and API.","created_at":"2018-04-11T22:25:11Z","updated_at":"2018-05-23T19:40:48Z","closed_at":null,"merged_at":null,"merge_commit_sha":"dc2c030ca1edfb2d1d259d539ce743853dec4fa8","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":699082627,"url":"https://api.github.com/repos/apache/incubator-trafficcontrol/labels/Traffic%20Ops%20API%20(golang)","name":"Traffic Ops API (golang)","color":"808080","default":false},{"id":689459120,"url":"https://api.github.com/repos/apache/incubator-trafficcontrol/labels/WIP","name":"WIP","color":"b60205","default":false},{"id":435396618,"url":"https://api.github.com/repos/apache/incubator-trafficcontrol/labels/enhancement","name":"enhancement","color":"84b6eb","default":true}],"milestone":null,"commits_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/pulls/2124/commits","review_comments_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/pulls/2124/comments","review_comment_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/issues/2124/comments","statuses_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/statuses/8cc4cfaad64533751bd118a61d7acbf2ac125de6","head":{"label":"rob05c:to-servers-allgo","ref":"to-servers-allgo","sha":"8cc4cfaad64533751bd118a61d7acbf2ac125de6","user":{"login":"rob05c","id":5113421,"avatar_url":"https://avatars3.githubusercontent.com/u/5113421?v=4","gravatar_id":"","url":"https://api.github.com/users/rob05c","html_url":"https://github.com/rob05c","followers_url":"https://api.github.com/users/rob05c/followers","following_url":"https://api.github.com/users/rob05c/following{/other_user}","gists_url":"https://api.github.com/users/rob05c/gists{/gist_id}","starred_url":"https://api.github.com/users/rob05c/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rob05c/subscriptions","organizations_url":"https://api.github.com/users/rob05c/orgs","repos_url":"https://api.github.com/users/rob05c/repos","events_url":"https://api.github.com/users/rob05c/events{/privacy}","received_events_url":"https://api.github.com/users/rob05c/received_events","type":"User","site_admin":false},"repo":{"id":71181197,"name":"incubator-trafficcontrol","full_name":"rob05c/incubator-trafficcontrol","owner":{"login":"rob05c","id":5113421,"avatar_url":"https://avatars3.githubusercontent.com/u/5113421?v=4","gravatar_id":"","url":"https://api.github.com/users/rob05c","html_url":"https://github.com/rob05c","followers_url":"https://api.github.com/users/rob05c/followers","following_url":"https://api.github.com/users/rob05c/following{/other_user}","gists_url":"https://api.github.com/users/rob05c/gists{/gist_id}","starred_url":"https://api.github.com/users/rob05c/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rob05c/subscriptions","organizations_url":"https://api.github.com/users/rob05c/orgs","repos_url":"https://api.github.com/users/rob05c/repos","events_url":"https://api.github.com/users/rob05c/events{/privacy}","received_events_url":"https://api.github.com/users/rob05c/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/rob05c/incubator-trafficcontrol","description":"Mirror of Apache Traffic Control (incubating)","fork":true,"url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol","forks_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/forks","keys_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/teams","hooks_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/hooks","issue_events_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/issues/events{/number}","events_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/events","assignees_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/assignees{/user}","branches_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/branches{/branch}","tags_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/tags","blobs_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/git/refs{/sha}","trees_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/statuses/{sha}","languages_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/languages","stargazers_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/stargazers","contributors_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/contributors","subscribers_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/subscribers","subscription_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/subscription","commits_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/commits{/sha}","git_commits_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/git/commits{/sha}","comments_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/comments{/number}","issue_comment_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/issues/comments{/number}","contents_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/contents/{+path}","compare_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/merges","archive_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/downloads","issues_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/issues{/number}","pulls_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/pulls{/number}","milestones_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/milestones{/number}","notifications_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/labels{/name}","releases_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/releases{/id}","deployments_url":"https://api.github.com/repos/rob05c/incubator-trafficcontrol/deployments","created_at":"2016-10-17T21:05:38Z","updated_at":"2018-05-23T15:10:47Z","pushed_at":"2018-05-23T19:39:43Z","git_url":"git://github.com/rob05c/incubator-trafficcontrol.git","ssh_url":"git@github.com:rob05c/incubator-trafficcontrol.git","clone_url":"https://github.com/rob05c/incubator-trafficcontrol.git","svn_url":"https://github.com/rob05c/incubator-trafficcontrol","homepage":null,"size":81280,"stargazers_count":0,"watchers_count":0,"language":"Perl","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"apache:master","ref":"master","sha":"13725325f2020ffe68122f4cbe8856aa75da2bd6","user":{"login":"apache","id":47359,"avatar_url":"https://avatars0.githubusercontent.com/u/47359?v=4","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"repo":{"id":67198520,"name":"incubator-trafficcontrol","full_name":"apache/incubator-trafficcontrol","owner":{"login":"apache","id":47359,"avatar_url":"https://avatars0.githubusercontent.com/u/47359?v=4","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/apache/incubator-trafficcontrol","description":"Mirror of Apache Traffic Control (incubating)","fork":false,"url":"https://api.github.com/repos/apache/incubator-trafficcontrol","forks_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/forks","keys_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/teams","hooks_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/hooks","issue_events_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/issues/events{/number}","events_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/events","assignees_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/assignees{/user}","branches_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/branches{/branch}","tags_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/tags","blobs_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/git/refs{/sha}","trees_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/statuses/{sha}","languages_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/languages","stargazers_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/stargazers","contributors_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/contributors","subscribers_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/subscribers","subscription_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/subscription","commits_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/commits{/sha}","git_commits_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/git/commits{/sha}","comments_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/comments{/number}","issue_comment_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/issues/comments{/number}","contents_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/contents/{+path}","compare_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/merges","archive_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/downloads","issues_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/issues{/number}","pulls_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/pulls{/number}","milestones_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/milestones{/number}","notifications_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/labels{/name}","releases_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/releases{/id}","deployments_url":"https://api.github.com/repos/apache/incubator-trafficcontrol/deployments","created_at":"2016-09-02T07:00:06Z","updated_at":"2018-05-23T18:51:39Z","pushed_at":"2018-05-23T19:39:44Z","git_url":"git://github.com/apache/incubator-trafficcontrol.git","ssh_url":"git@github.com:apache/incubator-trafficcontrol.git","clone_url":"https://github.com/apache/incubator-trafficcontrol.git","svn_url":"https://github.com/apache/incubator-trafficcontrol","homepage":null,"size":72125,"stargazers_count":131,"watchers_count":131,"language":"Perl","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":107,"mirror_url":null,"archived":false,"open_issues_count":461,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":107,"open_issues":461,"watchers":131,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apache/incubator-trafficcontrol/pulls/2124"},"html":{"href":"https://github.com/apache/incubator-trafficcontrol/pull/2124"},"issue":{"href":"https://api.github.com/repos/apache/incubator-trafficcontrol/issues/2124"},"comments":{"href":"https://api.github.com/repos/apache/incubator-trafficcontrol/issues/2124/comments"},"review_comments":{"href":"https://api.github.com/repos/apache/incubator-trafficcontrol/pulls/2124/comments"},"review_comment":{"href":"https://api.github.com/repos/apache/incubator-trafficcontrol/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apache/incubator-trafficcontrol/pulls/2124/commits"},"statuses":{"href":"https://api.github.com/repos/apache/incubator-trafficcontrol/statuses/8cc4cfaad64533751bd118a61d7acbf2ac125de6"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"rob05c"}}