{"action":"created","comment":{"url":"https://api.github.com/repos/istio/istio/pulls/comments/210024672","pull_request_review_id":146154765,"id":210024672,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxMDAyNDY3Mg==","diff_hunk":"@@ -0,0 +1,248 @@\n+// Copyright 2018 Istio Authors\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+package coredatamodel\n+\n+import (\n+\t\"errors\"\n+\t\"fmt\"\n+\t\"sync\"\n+\t\"time\"\n+\n+\t\"github.com/gogo/protobuf/proto\"\n+\t\"istio.io/istio/pilot/pkg/model\"\n+\tmcpclient \"istio.io/istio/pkg/mcp/client\"\n+)\n+\n+var (\n+\terrNotFound      = errors.New(\"item not found\")\n+\terrAlreadyExists = errors.New(\"item already exists\")\n+\terrUnsupported   = errors.New(\"this operation is not supported by mcp controller\")\n+)\n+\n+//go:generate counterfeiter -o fakes/logger.go --fake-name Logger . logger\n+type logger interface {\n+\tWarnf(template string, args ...interface{})\n+\tInfof(template string, args ...interface{})\n+}\n+\n+type CoreDataModel interface {\n+\tmodel.ConfigStoreCache\n+\tmcpclient.Updater\n+}\n+\n+type changeEvent struct {\n+\tmetaName       string\n+\tresource       proto.Message\n+\tdescriptorType string\n+}\n+\n+type Controller struct {\n+\tconfigStore              map[string]map[string]*sync.Map\n+\teventCh                  chan func(model.Config, model.Event)\n+\tupdateCh                 chan changeEvent\n+\tdescriptorsByMessageName map[string]model.ProtoSchema\n+\tlogger                   logger\n+}\n+\n+func NewController(logger logger) CoreDataModel {\n+\tdescriptorsByMessageName := make(map[string]model.ProtoSchema, len(model.IstioConfigTypes))\n+\tfor _, config := range model.IstioConfigTypes {\n+\t\tdescriptorsByMessageName[config.MessageName] = config\n+\t}\n+\n+\tconfigStore := make(map[string]map[string]*sync.Map)\n+\tfor _, typ := range model.IstioConfigTypes.Types() {\n+\t\tconfigStore[typ] = make(map[string]*sync.Map)\n+\t}\n+\treturn &Controller{\n+\t\tconfigStore:              configStore,\n+\t\teventCh:                  make(chan func(model.Config, model.Event)),\n+\t\tupdateCh:                 make(chan changeEvent),\n+\t\tdescriptorsByMessageName: descriptorsByMessageName,\n+\t\tlogger: logger,\n+\t}\n+}\n+\n+func (c *Controller) Run(stop <-chan struct{}) {\n+\tfor {\n+\t\tselect {\n+\t\tcase <-stop:\n+\t\t\tif _, ok := <-c.eventCh; ok {\n+\t\t\t\tclose(c.eventCh)\n+\t\t\t}\n+\t\t\treturn\n+\t\tcase event, ok := <-c.eventCh:\n+\t\t\tif ok {\n+\t\t\t\t// TODO: do we need to call the events with any other args?\n+\t\t\t\tevent(model.Config{}, model.EventUpdate)\n+\t\t\t}\n+\t\tcase change, ok := <-c.updateCh:\n+\t\t\tif ok {\n+\t\t\t\tconf, exists := c.Get(change.descriptorType, change.metaName, \"\")\n+\t\t\t\tif exists {\n+\t\t\t\t\tconf.Spec = change.resource\n+\t\t\t\t\t// handle the error by inserting it in a chan\n+\t\t\t\t\tc.Update(*conf)\n+\t\t\t\t}\n+\t\t\t}\n+\t\t}\n+\t}\n+}\n+\n+func (c *Controller) RegisterEventHandler(typ string, handler func(model.Config, model.Event)) {\n+\tc.eventCh <- handler\n+}\n+\n+func (c *Controller) ConfigDescriptor() model.ConfigDescriptor {\n+\treturn model.IstioConfigTypes\n+}\n+\n+func (c *Controller) Get(typ, name, namespace string) (*model.Config, bool) {\n+\t_, ok := c.configStore[typ]\n+\tif !ok {\n+\t\tc.logger.Infof(\"Get: config not found for the type %s\", typ)\n+\t\treturn nil, false\n+\t}\n+\n+\tns, exists := c.configStore[typ][namespace]\n+\tif !exists {\n+\t\tc.logger.Infof(\"Get: config not found for the type %s\", typ)\n+\t\treturn nil, false\n+\t}\n+\n+\tout, exists := ns.Load(name)\n+\tif !exists {\n+\t\treturn nil, false\n+\t}\n+\tconfig := out.(model.Config)\n+\n+\treturn &config, true\n+}\n+\n+func (c *Controller) List(typ, namespace string) ([]model.Config, error) {\n+\t_, ok := c.ConfigDescriptor().GetByType(typ)\n+\tif !ok {\n+\t\treturn nil, errors.New(fmt.Sprintf(\"List: unknown type %s\", typ))\n+\t}\n+\tdata, exists := c.configStore[typ]\n+\tif !exists {\n+\t\tc.logger.Infof(\"List: config not found for the type %s\", typ)\n+\t\treturn nil, nil\n+\t}\n+\tout := make([]model.Config, 0, len(c.configStore[typ]))\n+\tif namespace == \"\" {\n+\t\tfor _, ns := range data {\n+\t\t\tns.Range(func(key, value interface{}) bool {\n+\t\t\t\tout = append(out, value.(model.Config))\n+\t\t\t\treturn true\n+\t\t\t})\n+\t\t}\n+\t} else {\n+\t\tns, exists := data[namespace]\n+\t\tif !exists {\n+\t\t\treturn nil, nil\n+\t\t}\n+\t\tns.Range(func(key, value interface{}) bool {\n+\t\t\tout = append(out, value.(model.Config))\n+\t\t\treturn true\n+\t\t})\n+\t}\n+\treturn out, nil\n+}\n+\n+func (c *Controller) Update(config model.Config) (newRevision string, err error) {","path":"pilot/pkg/config/mcp/controller.go","position":164,"original_position":164,"commit_id":"d995c62680a7c79a1f0a66cb27d191e2a8ac4e5b","original_commit_id":"d995c62680a7c79a1f0a66cb27d191e2a8ac4e5b","user":{"login":"Nino-K","id":10409174,"node_id":"MDQ6VXNlcjEwNDA5MTc0","avatar_url":"https://avatars2.githubusercontent.com/u/10409174?v=4","gravatar_id":"","url":"https://api.github.com/users/Nino-K","html_url":"https://github.com/Nino-K","followers_url":"https://api.github.com/users/Nino-K/followers","following_url":"https://api.github.com/users/Nino-K/following{/other_user}","gists_url":"https://api.github.com/users/Nino-K/gists{/gist_id}","starred_url":"https://api.github.com/users/Nino-K/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Nino-K/subscriptions","organizations_url":"https://api.github.com/users/Nino-K/orgs","repos_url":"https://api.github.com/users/Nino-K/repos","events_url":"https://api.github.com/users/Nino-K/events{/privacy}","received_events_url":"https://api.github.com/users/Nino-K/received_events","type":"User","site_admin":false},"body":"Sure that makes sense, however the create is used to populate some test data during tests, otherwise without create it wouldn't be easy to test since this controller does not allow you to inject a configStore nor it exposes it.","created_at":"2018-08-14T16:47:50Z","updated_at":"2018-08-14T16:47:50Z","html_url":"https://github.com/istio/istio/pull/7631#discussion_r210024672","pull_request_url":"https://api.github.com/repos/istio/istio/pulls/7631","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/istio/istio/pulls/comments/210024672"},"html":{"href":"https://github.com/istio/istio/pull/7631#discussion_r210024672"},"pull_request":{"href":"https://api.github.com/repos/istio/istio/pulls/7631"}},"in_reply_to_id":209833560},"pull_request":{"url":"https://api.github.com/repos/istio/istio/pulls/7631","id":206099429,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA2MDk5NDI5","html_url":"https://github.com/istio/istio/pull/7631","diff_url":"https://github.com/istio/istio/pull/7631.diff","patch_url":"https://github.com/istio/istio/pull/7631.patch","issue_url":"https://api.github.com/repos/istio/istio/issues/7631","number":7631,"state":"open","locked":false,"title":"[WIP] Pilot client mcp integration","user":{"login":"Nino-K","id":10409174,"node_id":"MDQ6VXNlcjEwNDA5MTc0","avatar_url":"https://avatars2.githubusercontent.com/u/10409174?v=4","gravatar_id":"","url":"https://api.github.com/users/Nino-K","html_url":"https://github.com/Nino-K","followers_url":"https://api.github.com/users/Nino-K/followers","following_url":"https://api.github.com/users/Nino-K/following{/other_user}","gists_url":"https://api.github.com/users/Nino-K/gists{/gist_id}","starred_url":"https://api.github.com/users/Nino-K/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Nino-K/subscriptions","organizations_url":"https://api.github.com/users/Nino-K/orgs","repos_url":"https://api.github.com/users/Nino-K/repos","events_url":"https://api.github.com/users/Nino-K/events{/privacy}","received_events_url":"https://api.github.com/users/Nino-K/received_events","type":"User","site_admin":false},"body":"PLEASE DO NOT MERGE THIS PR.\r\n\r\nThis PR is the first draft of mcp client integration in pilot bootstrap server and is meant to gather feedback on the work that is currently in progress. \r\n\r\nTODO items: \r\n- Updated still needs to handle serviceDiscovery as this PR only demonstrates configStore\r\n\r\nKnown errors, currently when mcp client and server support all the types (mirrored all types in configDescriptor) but when server sends envelopes only for a single type (e.g only Gateway) the following errors are seen in the logs.\r\n```\r\n2018-08-03T17:09:00.717530Z     error   MCP: sending NACK for version= nonce=1: error=\"rpc error: code = InvalidArgument desc = 3 errors occurred:\\n\\n* domain name \\\"\\\\n\\\\x0f\\\\b\\\\xa3?\\\\x12\\\\x04HTTP\\\\x1a\\\\x04http\\\\x12\\\\x01*\\\" invalid (label \\\"\\\\n\\\\x0f\\\\b\\\\xa3?\\\\x12\\\\x04HTTP\\\\x1a\\\\x04http\\\\x12\\\\x01*\\\" invalid)\\n* \\n\\x0f\\b\\xa3?\\x12\\x04HTTP\\x1a\\x04http\\x12\\x01* is not a valid IP\\n* http, tcp or tls must be provided in virtual service\"\r\n2018-08-03T17:09:00.717602Z     error   MCP: sending NACK for version= nonce=2: error=\"mismatched message type: got \\\"istio.routing.v1alpha1.EgressRule\\\" want \\\"\\\"\"\r\n2018-08-03T17:09:00.717635Z     error   MCP: sending NACK for version= nonce=3: error=\"rpc error: code = InvalidArgument desc = invalid host \\n\\x0f\\b\\xa3?\\x12\\x04HTTP\\x1a\\x04http\\x12\\x01*\"\r\n2018-08-03T17:09:00.717648Z     error   MCP: sending NACK for version= nonce=4: error=\"mismatched message type: got \\\"istio.rbac.v1alpha1.ServiceRole\\\" want \\\"\\\"\"\r\n2018-08-03T17:09:00.717669Z     error   MCP: sending NACK for version= nonce=5: error=\"mismatched message type: got \\\"istio.rbac.v1alpha1.ServiceRoleBinding\\\" want \\\"\\\"\"\r\n2018-08-03T17:09:00.717684Z     error   MCP: sending NACK for version= nonce=6: error=\"mismatched message type: got \\\"istio.routing.v1alpha1.RouteRule\\\" want \\\"\\\"\"\r\n2018-08-03T17:09:00.717742Z     error   MCP: sending NACK for version= nonce=8: error=\"rpc error: code = InvalidArgument desc = 2 errors occurred:\\n\\n* domain name \\\"\\\\n\\\\x0f\\\\b\\\\xa3?\\\\x12\\\\x04HTTP\\\\x1a\\\\x04http\\\\x12\\\\x01*\\\" invalid (label \\\"\\\\n\\\\x0f\\\\b\\\\xa3?\\\\x12\\\\x04HTTP\\\\x1a\\\\x04http\\\\x12\\\\x01*\\\" invalid)\\n* \\n\\x0f\\b\\xa3?\\x12\\x04HTTP\\x1a\\x04http\\x12\\x01* is not a valid IP\"\r\n2018-08-03T17:09:00.717786Z     error   MCP: sending NACK for version= nonce=9: error=\"rpc error: code = InvalidArgument desc = 3 errors occurred:\\n\\n* name \\\"\\\\b\\\\xa3?\\\\x12\\\\x04HTTP\\\\x1a\\\\x04http\\\" must be a valid label\\n* namespace \\\"*\\\" must be a valid label\\n* at least one spec must be specified\"\r\n```\r\n\r\nAddresses #6473 ","created_at":"2018-08-03T17:59:15Z","updated_at":"2018-08-14T16:47:50Z","closed_at":null,"merged_at":null,"merge_commit_sha":"91e9db4dd31454f15b72855e7e459ea1f834fb46","assignee":null,"assignees":[],"requested_reviewers":[{"login":"kyessenov","id":9537734,"node_id":"MDQ6VXNlcjk1Mzc3MzQ=","avatar_url":"https://avatars2.githubusercontent.com/u/9537734?v=4","gravatar_id":"","url":"https://api.github.com/users/kyessenov","html_url":"https://github.com/kyessenov","followers_url":"https://api.github.com/users/kyessenov/followers","following_url":"https://api.github.com/users/kyessenov/following{/other_user}","gists_url":"https://api.github.com/users/kyessenov/gists{/gist_id}","starred_url":"https://api.github.com/users/kyessenov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kyessenov/subscriptions","organizations_url":"https://api.github.com/users/kyessenov/orgs","repos_url":"https://api.github.com/users/kyessenov/repos","events_url":"https://api.github.com/users/kyessenov/events{/privacy}","received_events_url":"https://api.github.com/users/kyessenov/received_events","type":"User","site_admin":false},{"login":"yutongz","id":25786429,"node_id":"MDQ6VXNlcjI1Nzg2NDI5","avatar_url":"https://avatars2.githubusercontent.com/u/25786429?v=4","gravatar_id":"","url":"https://api.github.com/users/yutongz","html_url":"https://github.com/yutongz","followers_url":"https://api.github.com/users/yutongz/followers","following_url":"https://api.github.com/users/yutongz/following{/other_user}","gists_url":"https://api.github.com/users/yutongz/gists{/gist_id}","starred_url":"https://api.github.com/users/yutongz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yutongz/subscriptions","organizations_url":"https://api.github.com/users/yutongz/orgs","repos_url":"https://api.github.com/users/yutongz/repos","events_url":"https://api.github.com/users/yutongz/events{/privacy}","received_events_url":"https://api.github.com/users/yutongz/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":491318041,"node_id":"MDU6TGFiZWw0OTEzMTgwNDE=","url":"https://api.github.com/repos/istio/istio/labels/cla:%20no","name":"cla: no","color":"bfdadc","default":false},{"id":957605109,"node_id":"MDU6TGFiZWw5NTc2MDUxMDk=","url":"https://api.github.com/repos/istio/istio/labels/do-not-merge/work-in-progress","name":"do-not-merge/work-in-progress","color":"bfdadc","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/istio/istio/pulls/7631/commits","review_comments_url":"https://api.github.com/repos/istio/istio/pulls/7631/comments","review_comment_url":"https://api.github.com/repos/istio/istio/pulls/comments{/number}","comments_url":"https://api.github.com/repos/istio/istio/issues/7631/comments","statuses_url":"https://api.github.com/repos/istio/istio/statuses/d995c62680a7c79a1f0a66cb27d191e2a8ac4e5b","head":{"label":"cloudfoundry:pilot-client-mcp-integration","ref":"pilot-client-mcp-integration","sha":"d995c62680a7c79a1f0a66cb27d191e2a8ac4e5b","user":{"login":"cloudfoundry","id":621746,"node_id":"MDEyOk9yZ2FuaXphdGlvbjYyMTc0Ng==","avatar_url":"https://avatars0.githubusercontent.com/u/621746?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudfoundry","html_url":"https://github.com/cloudfoundry","followers_url":"https://api.github.com/users/cloudfoundry/followers","following_url":"https://api.github.com/users/cloudfoundry/following{/other_user}","gists_url":"https://api.github.com/users/cloudfoundry/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudfoundry/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudfoundry/subscriptions","organizations_url":"https://api.github.com/users/cloudfoundry/orgs","repos_url":"https://api.github.com/users/cloudfoundry/repos","events_url":"https://api.github.com/users/cloudfoundry/events{/privacy}","received_events_url":"https://api.github.com/users/cloudfoundry/received_events","type":"Organization","site_admin":false},"repo":{"id":126548385,"node_id":"MDEwOlJlcG9zaXRvcnkxMjY1NDgzODU=","name":"istio","full_name":"cloudfoundry/istio","owner":{"login":"cloudfoundry","id":621746,"node_id":"MDEyOk9yZ2FuaXphdGlvbjYyMTc0Ng==","avatar_url":"https://avatars0.githubusercontent.com/u/621746?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudfoundry","html_url":"https://github.com/cloudfoundry","followers_url":"https://api.github.com/users/cloudfoundry/followers","following_url":"https://api.github.com/users/cloudfoundry/following{/other_user}","gists_url":"https://api.github.com/users/cloudfoundry/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudfoundry/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudfoundry/subscriptions","organizations_url":"https://api.github.com/users/cloudfoundry/orgs","repos_url":"https://api.github.com/users/cloudfoundry/repos","events_url":"https://api.github.com/users/cloudfoundry/events{/privacy}","received_events_url":"https://api.github.com/users/cloudfoundry/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/cloudfoundry/istio","description":"An open platform to connect, manage, and secure microservices.","fork":true,"url":"https://api.github.com/repos/cloudfoundry/istio","forks_url":"https://api.github.com/repos/cloudfoundry/istio/forks","keys_url":"https://api.github.com/repos/cloudfoundry/istio/keys{/key_id}","collaborators_url":"https://api.github.com/repos/cloudfoundry/istio/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/cloudfoundry/istio/teams","hooks_url":"https://api.github.com/repos/cloudfoundry/istio/hooks","issue_events_url":"https://api.github.com/repos/cloudfoundry/istio/issues/events{/number}","events_url":"https://api.github.com/repos/cloudfoundry/istio/events","assignees_url":"https://api.github.com/repos/cloudfoundry/istio/assignees{/user}","branches_url":"https://api.github.com/repos/cloudfoundry/istio/branches{/branch}","tags_url":"https://api.github.com/repos/cloudfoundry/istio/tags","blobs_url":"https://api.github.com/repos/cloudfoundry/istio/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/cloudfoundry/istio/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/cloudfoundry/istio/git/refs{/sha}","trees_url":"https://api.github.com/repos/cloudfoundry/istio/git/trees{/sha}","statuses_url":"https://api.github.com/repos/cloudfoundry/istio/statuses/{sha}","languages_url":"https://api.github.com/repos/cloudfoundry/istio/languages","stargazers_url":"https://api.github.com/repos/cloudfoundry/istio/stargazers","contributors_url":"https://api.github.com/repos/cloudfoundry/istio/contributors","subscribers_url":"https://api.github.com/repos/cloudfoundry/istio/subscribers","subscription_url":"https://api.github.com/repos/cloudfoundry/istio/subscription","commits_url":"https://api.github.com/repos/cloudfoundry/istio/commits{/sha}","git_commits_url":"https://api.github.com/repos/cloudfoundry/istio/git/commits{/sha}","comments_url":"https://api.github.com/repos/cloudfoundry/istio/comments{/number}","issue_comment_url":"https://api.github.com/repos/cloudfoundry/istio/issues/comments{/number}","contents_url":"https://api.github.com/repos/cloudfoundry/istio/contents/{+path}","compare_url":"https://api.github.com/repos/cloudfoundry/istio/compare/{base}...{head}","merges_url":"https://api.github.com/repos/cloudfoundry/istio/merges","archive_url":"https://api.github.com/repos/cloudfoundry/istio/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/cloudfoundry/istio/downloads","issues_url":"https://api.github.com/repos/cloudfoundry/istio/issues{/number}","pulls_url":"https://api.github.com/repos/cloudfoundry/istio/pulls{/number}","milestones_url":"https://api.github.com/repos/cloudfoundry/istio/milestones{/number}","notifications_url":"https://api.github.com/repos/cloudfoundry/istio/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/cloudfoundry/istio/labels{/name}","releases_url":"https://api.github.com/repos/cloudfoundry/istio/releases{/id}","deployments_url":"https://api.github.com/repos/cloudfoundry/istio/deployments","created_at":"2018-03-23T23:25:30Z","updated_at":"2018-07-24T15:05:54Z","pushed_at":"2018-08-13T17:33:45Z","git_url":"git://github.com/cloudfoundry/istio.git","ssh_url":"git@github.com:cloudfoundry/istio.git","clone_url":"https://github.com/cloudfoundry/istio.git","svn_url":"https://github.com/cloudfoundry/istio","homepage":"https://istio.io","size":42902,"stargazers_count":1,"watchers_count":1,"language":"Go","has_issues":false,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"istio:master","ref":"master","sha":"3bd7c54e8c9f5a0aa0927696a32a46f7b68e2d3b","user":{"login":"istio","id":23534644,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIzNTM0NjQ0","avatar_url":"https://avatars1.githubusercontent.com/u/23534644?v=4","gravatar_id":"","url":"https://api.github.com/users/istio","html_url":"https://github.com/istio","followers_url":"https://api.github.com/users/istio/followers","following_url":"https://api.github.com/users/istio/following{/other_user}","gists_url":"https://api.github.com/users/istio/gists{/gist_id}","starred_url":"https://api.github.com/users/istio/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/istio/subscriptions","organizations_url":"https://api.github.com/users/istio/orgs","repos_url":"https://api.github.com/users/istio/repos","events_url":"https://api.github.com/users/istio/events{/privacy}","received_events_url":"https://api.github.com/users/istio/received_events","type":"Organization","site_admin":false},"repo":{"id":74175805,"node_id":"MDEwOlJlcG9zaXRvcnk3NDE3NTgwNQ==","name":"istio","full_name":"istio/istio","owner":{"login":"istio","id":23534644,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIzNTM0NjQ0","avatar_url":"https://avatars1.githubusercontent.com/u/23534644?v=4","gravatar_id":"","url":"https://api.github.com/users/istio","html_url":"https://github.com/istio","followers_url":"https://api.github.com/users/istio/followers","following_url":"https://api.github.com/users/istio/following{/other_user}","gists_url":"https://api.github.com/users/istio/gists{/gist_id}","starred_url":"https://api.github.com/users/istio/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/istio/subscriptions","organizations_url":"https://api.github.com/users/istio/orgs","repos_url":"https://api.github.com/users/istio/repos","events_url":"https://api.github.com/users/istio/events{/privacy}","received_events_url":"https://api.github.com/users/istio/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/istio/istio","description":"Connect, secure, control, and observe services.","fork":false,"url":"https://api.github.com/repos/istio/istio","forks_url":"https://api.github.com/repos/istio/istio/forks","keys_url":"https://api.github.com/repos/istio/istio/keys{/key_id}","collaborators_url":"https://api.github.com/repos/istio/istio/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/istio/istio/teams","hooks_url":"https://api.github.com/repos/istio/istio/hooks","issue_events_url":"https://api.github.com/repos/istio/istio/issues/events{/number}","events_url":"https://api.github.com/repos/istio/istio/events","assignees_url":"https://api.github.com/repos/istio/istio/assignees{/user}","branches_url":"https://api.github.com/repos/istio/istio/branches{/branch}","tags_url":"https://api.github.com/repos/istio/istio/tags","blobs_url":"https://api.github.com/repos/istio/istio/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/istio/istio/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/istio/istio/git/refs{/sha}","trees_url":"https://api.github.com/repos/istio/istio/git/trees{/sha}","statuses_url":"https://api.github.com/repos/istio/istio/statuses/{sha}","languages_url":"https://api.github.com/repos/istio/istio/languages","stargazers_url":"https://api.github.com/repos/istio/istio/stargazers","contributors_url":"https://api.github.com/repos/istio/istio/contributors","subscribers_url":"https://api.github.com/repos/istio/istio/subscribers","subscription_url":"https://api.github.com/repos/istio/istio/subscription","commits_url":"https://api.github.com/repos/istio/istio/commits{/sha}","git_commits_url":"https://api.github.com/repos/istio/istio/git/commits{/sha}","comments_url":"https://api.github.com/repos/istio/istio/comments{/number}","issue_comment_url":"https://api.github.com/repos/istio/istio/issues/comments{/number}","contents_url":"https://api.github.com/repos/istio/istio/contents/{+path}","compare_url":"https://api.github.com/repos/istio/istio/compare/{base}...{head}","merges_url":"https://api.github.com/repos/istio/istio/merges","archive_url":"https://api.github.com/repos/istio/istio/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/istio/istio/downloads","issues_url":"https://api.github.com/repos/istio/istio/issues{/number}","pulls_url":"https://api.github.com/repos/istio/istio/pulls{/number}","milestones_url":"https://api.github.com/repos/istio/istio/milestones{/number}","notifications_url":"https://api.github.com/repos/istio/istio/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/istio/istio/labels{/name}","releases_url":"https://api.github.com/repos/istio/istio/releases{/id}","deployments_url":"https://api.github.com/repos/istio/istio/deployments","created_at":"2016-11-18T23:57:21Z","updated_at":"2018-08-14T16:29:18Z","pushed_at":"2018-08-14T16:29:22Z","git_url":"git://github.com/istio/istio.git","ssh_url":"git@github.com:istio/istio.git","clone_url":"https://github.com/istio/istio.git","svn_url":"https://github.com/istio/istio","homepage":"https://istio.io","size":44401,"stargazers_count":10800,"watchers_count":10800,"language":"Go","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1533,"mirror_url":null,"archived":false,"open_issues_count":918,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":1533,"open_issues":918,"watchers":10800,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/istio/istio/pulls/7631"},"html":{"href":"https://github.com/istio/istio/pull/7631"},"issue":{"href":"https://api.github.com/repos/istio/istio/issues/7631"},"comments":{"href":"https://api.github.com/repos/istio/istio/issues/7631/comments"},"review_comments":{"href":"https://api.github.com/repos/istio/istio/pulls/7631/comments"},"review_comment":{"href":"https://api.github.com/repos/istio/istio/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/istio/istio/pulls/7631/commits"},"statuses":{"href":"https://api.github.com/repos/istio/istio/statuses/d995c62680a7c79a1f0a66cb27d191e2a8ac4e5b"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"Nino-K"}}