{"action":"created","comment":{"url":"https://api.github.com/repos/giantswarm/azure-operator/pulls/comments/199566478","pull_request_review_id":133710351,"id":199566478,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDE5OTU2NjQ3OA==","diff_hunk":"@@ -0,0 +1,172 @@\n+package vpngateway\n+\n+import (\n+\t\"context\"\n+\n+\t\"github.com/Azure/azure-sdk-for-go/services/network/mgmt/2017-09-01/network\"\n+\tproviderv1alpha1 \"github.com/giantswarm/apiextensions/pkg/apis/provider/v1alpha1\"\n+\t\"github.com/giantswarm/microerror\"\n+\t\"github.com/giantswarm/operatorkit/controller\"\n+\n+\t\"github.com/giantswarm/azure-operator/service/controller/v3/key\"\n+)\n+\n+// NewUpdatePatch provide a controller.Patch holding the needed connections update.\n+func (r *Resource) NewUpdatePatch(ctx context.Context, azureConfig, current, desired interface{}) (*controller.Patch, error) {\n+\ta, err := key.ToCustomObject(azureConfig)\n+\tif err != nil {\n+\t\treturn nil, microerror.Mask(err)\n+\t}\n+\n+\tc, err := toVPNGatewayConnections(current)\n+\tif err != nil {\n+\t\treturn nil, microerror.Mask(err)\n+\t}\n+\n+\td, err := toVPNGatewayConnections(desired)\n+\tif err != nil {\n+\t\treturn nil, microerror.Mask(err)\n+\t}\n+\n+\tpatch, err := r.newUpdatePatch(ctx, a, c, d)\n+\tif err != nil {\n+\t\treturn nil, microerror.Mask(err)\n+\t}\n+\n+\treturn patch, nil\n+}\n+\n+func (r *Resource) newUpdatePatch(ctx context.Context, azureConfig providerv1alpha1.AzureConfig, current, desired connections) (*controller.Patch, error) {\n+\tpatch := controller.NewPatch()\n+\n+\tchange := r.newUpdateChange(ctx, azureConfig, current, desired)\n+\n+\tpatch.SetUpdateChange(change)\n+\n+\treturn patch, nil\n+}\n+\n+func (r *Resource) newUpdateChange(ctx context.Context, azureConfig providerv1alpha1.AzureConfig, current, desired connections) connections {\n+\tvar change connections\n+\n+\tif needUpdate(current.Host, desired.Host) {\n+\t\tchange = desired\n+\t}\n+\tif needUpdate(current.Guest, desired.Guest) {\n+\t\tchange = desired\n+\t}\n+\n+\treturn change\n+}\n+\n+// needUpdate determine if current needs to be updated in order to comply with\n+// desired. Following properties are examined:\n+//\n+//     Name\n+//     VirtualNetworkGatewayConnectionPropertiesFormat.VirtualNetworkGateway1.ID\n+//     VirtualNetworkGatewayConnectionPropertiesFormat.VirtualNetworkGateway2.ID\n+//     VirtualNetworkGatewayConnectionPropertiesFormat.ConnectionType\n+//     VirtualNetworkGatewayConnectionPropertiesFormat.ConnectionStatus\n+//\n+func needUpdate(current, desired network.VirtualNetworkGatewayConnection) bool {\n+\tif desired.Name == nil ||\n+\t\tdesired.VirtualNetworkGatewayConnectionPropertiesFormat == nil ||\n+\t\tdesired.VirtualNetworkGatewayConnectionPropertiesFormat.VirtualNetworkGateway1 == nil ||\n+\t\tdesired.VirtualNetworkGatewayConnectionPropertiesFormat.VirtualNetworkGateway1.ID == nil ||\n+\t\tdesired.VirtualNetworkGatewayConnectionPropertiesFormat.VirtualNetworkGateway2 == nil ||\n+\t\tdesired.VirtualNetworkGatewayConnectionPropertiesFormat.VirtualNetworkGateway2.ID == nil {\n+\t\treturn false\n+\t}\n+\n+\tif current.Name == nil ||\n+\t\t*current.Name != *desired.Name {\n+\t\treturn true\n+\t}\n+\n+\tif current.VirtualNetworkGatewayConnectionPropertiesFormat == nil {\n+\t\treturn true\n+\t}\n+\n+\tif current.VirtualNetworkGatewayConnectionPropertiesFormat.ConnectionType !=\n+\t\tdesired.VirtualNetworkGatewayConnectionPropertiesFormat.ConnectionType {\n+\t\treturn true\n+\t}\n+\n+\tif current.VirtualNetworkGatewayConnectionPropertiesFormat.VirtualNetworkGateway1 == nil ||\n+\t\tcurrent.VirtualNetworkGatewayConnectionPropertiesFormat.VirtualNetworkGateway1.ID == nil ||\n+\t\t*current.VirtualNetworkGatewayConnectionPropertiesFormat.VirtualNetworkGateway1.ID !=\n+\t\t\t*desired.VirtualNetworkGatewayConnectionPropertiesFormat.VirtualNetworkGateway1.ID {\n+\t\treturn true\n+\t}\n+\n+\tif current.VirtualNetworkGatewayConnectionPropertiesFormat.VirtualNetworkGateway2 == nil ||\n+\t\tcurrent.VirtualNetworkGatewayConnectionPropertiesFormat.VirtualNetworkGateway2.ID == nil ||\n+\t\t*current.VirtualNetworkGatewayConnectionPropertiesFormat.VirtualNetworkGateway2.ID !=\n+\t\t\t*desired.VirtualNetworkGatewayConnectionPropertiesFormat.VirtualNetworkGateway2.ID {\n+\t\treturn true\n+\t}\n+\n+\tif current.VirtualNetworkGatewayConnectionPropertiesFormat.ConnectionStatus == network.VirtualNetworkGatewayConnectionStatusNotConnected {\n+\t\treturn true\n+\t}\n+\n+\treturn false\n+}\n+\n+// ApplyUpdateChange perform the host cluster vpn gateway connections update against azure.\n+func (r *Resource) ApplyUpdateChange(ctx context.Context, azureConfig, change interface{}) error {\n+\ta, err := key.ToCustomObject(azureConfig)\n+\tif err != nil {\n+\t\treturn microerror.Mask(err)\n+\t}\n+\n+\tc, err := toVPNGatewayConnections(change)\n+\tif err != nil {\n+\t\treturn microerror.Mask(err)\n+\t}\n+\n+\terr = r.applyUpdateChange(ctx, a, c)\n+\tif err != nil {\n+\t\treturn microerror.Mask(err)\n+\t}\n+\n+\treturn nil\n+}\n+\n+func (r *Resource) applyUpdateChange(ctx context.Context, azureConfig providerv1alpha1.AzureConfig, change connections) error {\n+\tr.logger.LogCtx(ctx, \"level\", \"debug\", \"message\", \"ensure vpn gateway connections\")\n+\n+\tif change.isEmpty() {\n+\t\tr.logger.LogCtx(ctx, \"level\", \"debug\", \"message\", \"ensure vpn gateway connections: already ensured\")","path":"service/controller/v3/resource/vpngateway/update.go","position":140,"original_position":140,"commit_id":"2807d8f179078fbfb6cca9bf5f01cfddb847c77b","original_commit_id":"2807d8f179078fbfb6cca9bf5f01cfddb847c77b","user":{"login":"xh3b4sd","id":552769,"node_id":"MDQ6VXNlcjU1Mjc2OQ==","avatar_url":"https://avatars3.githubusercontent.com/u/552769?v=4","gravatar_id":"","url":"https://api.github.com/users/xh3b4sd","html_url":"https://github.com/xh3b4sd","followers_url":"https://api.github.com/users/xh3b4sd/followers","following_url":"https://api.github.com/users/xh3b4sd/following{/other_user}","gists_url":"https://api.github.com/users/xh3b4sd/gists{/gist_id}","starred_url":"https://api.github.com/users/xh3b4sd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xh3b4sd/subscriptions","organizations_url":"https://api.github.com/users/xh3b4sd/orgs","repos_url":"https://api.github.com/users/xh3b4sd/repos","events_url":"https://api.github.com/users/xh3b4sd/events{/privacy}","received_events_url":"https://api.github.com/users/xh3b4sd/received_events","type":"User","site_admin":false},"body":"As I mentioned this already a couple of times this message format is not what we use everywhere. It got introduced in the azure operator at some point for whatever reason but it is not really helping us IMO. I would like to stick to the messages as we have them everywhere else. ","created_at":"2018-07-02T17:21:05Z","updated_at":"2018-07-02T17:24:05Z","html_url":"https://github.com/giantswarm/azure-operator/pull/278#discussion_r199566478","pull_request_url":"https://api.github.com/repos/giantswarm/azure-operator/pulls/278","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/giantswarm/azure-operator/pulls/comments/199566478"},"html":{"href":"https://github.com/giantswarm/azure-operator/pull/278#discussion_r199566478"},"pull_request":{"href":"https://api.github.com/repos/giantswarm/azure-operator/pulls/278"}}},"pull_request":{"url":"https://api.github.com/repos/giantswarm/azure-operator/pulls/278","id":198031266,"node_id":"MDExOlB1bGxSZXF1ZXN0MTk4MDMxMjY2","html_url":"https://github.com/giantswarm/azure-operator/pull/278","diff_url":"https://github.com/giantswarm/azure-operator/pull/278.diff","patch_url":"https://github.com/giantswarm/azure-operator/pull/278.patch","issue_url":"https://api.github.com/repos/giantswarm/azure-operator/issues/278","number":278,"state":"open","locked":false,"title":"BYOC vpngateway","user":{"login":"TheoBrigitte","id":6536819,"node_id":"MDQ6VXNlcjY1MzY4MTk=","avatar_url":"https://avatars1.githubusercontent.com/u/6536819?v=4","gravatar_id":"","url":"https://api.github.com/users/TheoBrigitte","html_url":"https://github.com/TheoBrigitte","followers_url":"https://api.github.com/users/TheoBrigitte/followers","following_url":"https://api.github.com/users/TheoBrigitte/following{/other_user}","gists_url":"https://api.github.com/users/TheoBrigitte/gists{/gist_id}","starred_url":"https://api.github.com/users/TheoBrigitte/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/TheoBrigitte/subscriptions","organizations_url":"https://api.github.com/users/TheoBrigitte/orgs","repos_url":"https://api.github.com/users/TheoBrigitte/repos","events_url":"https://api.github.com/users/TheoBrigitte/events{/privacy}","received_events_url":"https://api.github.com/users/TheoBrigitte/received_events","type":"User","site_admin":false},"body":"Towards: https://github.com/giantswarm/giantswarm/issues/3316\r\n\r\nReplace vnet peering with vpn gateway, in order to connect host and guest cluster.\r\nThis is a requirement for BYOC since vnet peering does not work across different subscriptions owned by different tenants.","created_at":"2018-06-28T13:31:41Z","updated_at":"2018-07-02T17:24:05Z","closed_at":null,"merged_at":null,"merge_commit_sha":"660e9aa25d5c8f194d8121d9cb3d5bc0f216d081","assignee":{"login":"TheoBrigitte","id":6536819,"node_id":"MDQ6VXNlcjY1MzY4MTk=","avatar_url":"https://avatars1.githubusercontent.com/u/6536819?v=4","gravatar_id":"","url":"https://api.github.com/users/TheoBrigitte","html_url":"https://github.com/TheoBrigitte","followers_url":"https://api.github.com/users/TheoBrigitte/followers","following_url":"https://api.github.com/users/TheoBrigitte/following{/other_user}","gists_url":"https://api.github.com/users/TheoBrigitte/gists{/gist_id}","starred_url":"https://api.github.com/users/TheoBrigitte/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/TheoBrigitte/subscriptions","organizations_url":"https://api.github.com/users/TheoBrigitte/orgs","repos_url":"https://api.github.com/users/TheoBrigitte/repos","events_url":"https://api.github.com/users/TheoBrigitte/events{/privacy}","received_events_url":"https://api.github.com/users/TheoBrigitte/received_events","type":"User","site_admin":false},"assignees":[{"login":"TheoBrigitte","id":6536819,"node_id":"MDQ6VXNlcjY1MzY4MTk=","avatar_url":"https://avatars1.githubusercontent.com/u/6536819?v=4","gravatar_id":"","url":"https://api.github.com/users/TheoBrigitte","html_url":"https://github.com/TheoBrigitte","followers_url":"https://api.github.com/users/TheoBrigitte/followers","following_url":"https://api.github.com/users/TheoBrigitte/following{/other_user}","gists_url":"https://api.github.com/users/TheoBrigitte/gists{/gist_id}","starred_url":"https://api.github.com/users/TheoBrigitte/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/TheoBrigitte/subscriptions","organizations_url":"https://api.github.com/users/TheoBrigitte/orgs","repos_url":"https://api.github.com/users/TheoBrigitte/repos","events_url":"https://api.github.com/users/TheoBrigitte/events{/privacy}","received_events_url":"https://api.github.com/users/TheoBrigitte/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/giantswarm/azure-operator/pulls/278/commits","review_comments_url":"https://api.github.com/repos/giantswarm/azure-operator/pulls/278/comments","review_comment_url":"https://api.github.com/repos/giantswarm/azure-operator/pulls/comments{/number}","comments_url":"https://api.github.com/repos/giantswarm/azure-operator/issues/278/comments","statuses_url":"https://api.github.com/repos/giantswarm/azure-operator/statuses/2807d8f179078fbfb6cca9bf5f01cfddb847c77b","head":{"label":"giantswarm:byoc-vpngateway","ref":"byoc-vpngateway","sha":"2807d8f179078fbfb6cca9bf5f01cfddb847c77b","user":{"login":"giantswarm","id":7556340,"node_id":"MDEyOk9yZ2FuaXphdGlvbjc1NTYzNDA=","avatar_url":"https://avatars3.githubusercontent.com/u/7556340?v=4","gravatar_id":"","url":"https://api.github.com/users/giantswarm","html_url":"https://github.com/giantswarm","followers_url":"https://api.github.com/users/giantswarm/followers","following_url":"https://api.github.com/users/giantswarm/following{/other_user}","gists_url":"https://api.github.com/users/giantswarm/gists{/gist_id}","starred_url":"https://api.github.com/users/giantswarm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/giantswarm/subscriptions","organizations_url":"https://api.github.com/users/giantswarm/orgs","repos_url":"https://api.github.com/users/giantswarm/repos","events_url":"https://api.github.com/users/giantswarm/events{/privacy}","received_events_url":"https://api.github.com/users/giantswarm/received_events","type":"Organization","site_admin":false},"repo":{"id":99101543,"node_id":"MDEwOlJlcG9zaXRvcnk5OTEwMTU0Mw==","name":"azure-operator","full_name":"giantswarm/azure-operator","owner":{"login":"giantswarm","id":7556340,"node_id":"MDEyOk9yZ2FuaXphdGlvbjc1NTYzNDA=","avatar_url":"https://avatars3.githubusercontent.com/u/7556340?v=4","gravatar_id":"","url":"https://api.github.com/users/giantswarm","html_url":"https://github.com/giantswarm","followers_url":"https://api.github.com/users/giantswarm/followers","following_url":"https://api.github.com/users/giantswarm/following{/other_user}","gists_url":"https://api.github.com/users/giantswarm/gists{/gist_id}","starred_url":"https://api.github.com/users/giantswarm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/giantswarm/subscriptions","organizations_url":"https://api.github.com/users/giantswarm/orgs","repos_url":"https://api.github.com/users/giantswarm/repos","events_url":"https://api.github.com/users/giantswarm/events{/privacy}","received_events_url":"https://api.github.com/users/giantswarm/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/giantswarm/azure-operator","description":"Azure operator manages Kubernetes clusters running in Giantnetes on Azure","fork":false,"url":"https://api.github.com/repos/giantswarm/azure-operator","forks_url":"https://api.github.com/repos/giantswarm/azure-operator/forks","keys_url":"https://api.github.com/repos/giantswarm/azure-operator/keys{/key_id}","collaborators_url":"https://api.github.com/repos/giantswarm/azure-operator/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/giantswarm/azure-operator/teams","hooks_url":"https://api.github.com/repos/giantswarm/azure-operator/hooks","issue_events_url":"https://api.github.com/repos/giantswarm/azure-operator/issues/events{/number}","events_url":"https://api.github.com/repos/giantswarm/azure-operator/events","assignees_url":"https://api.github.com/repos/giantswarm/azure-operator/assignees{/user}","branches_url":"https://api.github.com/repos/giantswarm/azure-operator/branches{/branch}","tags_url":"https://api.github.com/repos/giantswarm/azure-operator/tags","blobs_url":"https://api.github.com/repos/giantswarm/azure-operator/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/giantswarm/azure-operator/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/giantswarm/azure-operator/git/refs{/sha}","trees_url":"https://api.github.com/repos/giantswarm/azure-operator/git/trees{/sha}","statuses_url":"https://api.github.com/repos/giantswarm/azure-operator/statuses/{sha}","languages_url":"https://api.github.com/repos/giantswarm/azure-operator/languages","stargazers_url":"https://api.github.com/repos/giantswarm/azure-operator/stargazers","contributors_url":"https://api.github.com/repos/giantswarm/azure-operator/contributors","subscribers_url":"https://api.github.com/repos/giantswarm/azure-operator/subscribers","subscription_url":"https://api.github.com/repos/giantswarm/azure-operator/subscription","commits_url":"https://api.github.com/repos/giantswarm/azure-operator/commits{/sha}","git_commits_url":"https://api.github.com/repos/giantswarm/azure-operator/git/commits{/sha}","comments_url":"https://api.github.com/repos/giantswarm/azure-operator/comments{/number}","issue_comment_url":"https://api.github.com/repos/giantswarm/azure-operator/issues/comments{/number}","contents_url":"https://api.github.com/repos/giantswarm/azure-operator/contents/{+path}","compare_url":"https://api.github.com/repos/giantswarm/azure-operator/compare/{base}...{head}","merges_url":"https://api.github.com/repos/giantswarm/azure-operator/merges","archive_url":"https://api.github.com/repos/giantswarm/azure-operator/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/giantswarm/azure-operator/downloads","issues_url":"https://api.github.com/repos/giantswarm/azure-operator/issues{/number}","pulls_url":"https://api.github.com/repos/giantswarm/azure-operator/pulls{/number}","milestones_url":"https://api.github.com/repos/giantswarm/azure-operator/milestones{/number}","notifications_url":"https://api.github.com/repos/giantswarm/azure-operator/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/giantswarm/azure-operator/labels{/name}","releases_url":"https://api.github.com/repos/giantswarm/azure-operator/releases{/id}","deployments_url":"https://api.github.com/repos/giantswarm/azure-operator/deployments","created_at":"2017-08-02T10:00:21Z","updated_at":"2018-07-02T14:15:02Z","pushed_at":"2018-07-02T17:08:05Z","git_url":"git://github.com/giantswarm/azure-operator.git","ssh_url":"git@github.com:giantswarm/azure-operator.git","clone_url":"https://github.com/giantswarm/azure-operator.git","svn_url":"https://github.com/giantswarm/azure-operator","homepage":"","size":46487,"stargazers_count":10,"watchers_count":10,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":4,"mirror_url":null,"archived":false,"open_issues_count":9,"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":4,"open_issues":9,"watchers":10,"default_branch":"master"}},"base":{"label":"giantswarm:master","ref":"master","sha":"a7f4a0bcec28ca551b77a18e32d39e6e16ed26e9","user":{"login":"giantswarm","id":7556340,"node_id":"MDEyOk9yZ2FuaXphdGlvbjc1NTYzNDA=","avatar_url":"https://avatars3.githubusercontent.com/u/7556340?v=4","gravatar_id":"","url":"https://api.github.com/users/giantswarm","html_url":"https://github.com/giantswarm","followers_url":"https://api.github.com/users/giantswarm/followers","following_url":"https://api.github.com/users/giantswarm/following{/other_user}","gists_url":"https://api.github.com/users/giantswarm/gists{/gist_id}","starred_url":"https://api.github.com/users/giantswarm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/giantswarm/subscriptions","organizations_url":"https://api.github.com/users/giantswarm/orgs","repos_url":"https://api.github.com/users/giantswarm/repos","events_url":"https://api.github.com/users/giantswarm/events{/privacy}","received_events_url":"https://api.github.com/users/giantswarm/received_events","type":"Organization","site_admin":false},"repo":{"id":99101543,"node_id":"MDEwOlJlcG9zaXRvcnk5OTEwMTU0Mw==","name":"azure-operator","full_name":"giantswarm/azure-operator","owner":{"login":"giantswarm","id":7556340,"node_id":"MDEyOk9yZ2FuaXphdGlvbjc1NTYzNDA=","avatar_url":"https://avatars3.githubusercontent.com/u/7556340?v=4","gravatar_id":"","url":"https://api.github.com/users/giantswarm","html_url":"https://github.com/giantswarm","followers_url":"https://api.github.com/users/giantswarm/followers","following_url":"https://api.github.com/users/giantswarm/following{/other_user}","gists_url":"https://api.github.com/users/giantswarm/gists{/gist_id}","starred_url":"https://api.github.com/users/giantswarm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/giantswarm/subscriptions","organizations_url":"https://api.github.com/users/giantswarm/orgs","repos_url":"https://api.github.com/users/giantswarm/repos","events_url":"https://api.github.com/users/giantswarm/events{/privacy}","received_events_url":"https://api.github.com/users/giantswarm/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/giantswarm/azure-operator","description":"Azure operator manages Kubernetes clusters running in Giantnetes on Azure","fork":false,"url":"https://api.github.com/repos/giantswarm/azure-operator","forks_url":"https://api.github.com/repos/giantswarm/azure-operator/forks","keys_url":"https://api.github.com/repos/giantswarm/azure-operator/keys{/key_id}","collaborators_url":"https://api.github.com/repos/giantswarm/azure-operator/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/giantswarm/azure-operator/teams","hooks_url":"https://api.github.com/repos/giantswarm/azure-operator/hooks","issue_events_url":"https://api.github.com/repos/giantswarm/azure-operator/issues/events{/number}","events_url":"https://api.github.com/repos/giantswarm/azure-operator/events","assignees_url":"https://api.github.com/repos/giantswarm/azure-operator/assignees{/user}","branches_url":"https://api.github.com/repos/giantswarm/azure-operator/branches{/branch}","tags_url":"https://api.github.com/repos/giantswarm/azure-operator/tags","blobs_url":"https://api.github.com/repos/giantswarm/azure-operator/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/giantswarm/azure-operator/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/giantswarm/azure-operator/git/refs{/sha}","trees_url":"https://api.github.com/repos/giantswarm/azure-operator/git/trees{/sha}","statuses_url":"https://api.github.com/repos/giantswarm/azure-operator/statuses/{sha}","languages_url":"https://api.github.com/repos/giantswarm/azure-operator/languages","stargazers_url":"https://api.github.com/repos/giantswarm/azure-operator/stargazers","contributors_url":"https://api.github.com/repos/giantswarm/azure-operator/contributors","subscribers_url":"https://api.github.com/repos/giantswarm/azure-operator/subscribers","subscription_url":"https://api.github.com/repos/giantswarm/azure-operator/subscription","commits_url":"https://api.github.com/repos/giantswarm/azure-operator/commits{/sha}","git_commits_url":"https://api.github.com/repos/giantswarm/azure-operator/git/commits{/sha}","comments_url":"https://api.github.com/repos/giantswarm/azure-operator/comments{/number}","issue_comment_url":"https://api.github.com/repos/giantswarm/azure-operator/issues/comments{/number}","contents_url":"https://api.github.com/repos/giantswarm/azure-operator/contents/{+path}","compare_url":"https://api.github.com/repos/giantswarm/azure-operator/compare/{base}...{head}","merges_url":"https://api.github.com/repos/giantswarm/azure-operator/merges","archive_url":"https://api.github.com/repos/giantswarm/azure-operator/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/giantswarm/azure-operator/downloads","issues_url":"https://api.github.com/repos/giantswarm/azure-operator/issues{/number}","pulls_url":"https://api.github.com/repos/giantswarm/azure-operator/pulls{/number}","milestones_url":"https://api.github.com/repos/giantswarm/azure-operator/milestones{/number}","notifications_url":"https://api.github.com/repos/giantswarm/azure-operator/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/giantswarm/azure-operator/labels{/name}","releases_url":"https://api.github.com/repos/giantswarm/azure-operator/releases{/id}","deployments_url":"https://api.github.com/repos/giantswarm/azure-operator/deployments","created_at":"2017-08-02T10:00:21Z","updated_at":"2018-07-02T14:15:02Z","pushed_at":"2018-07-02T17:08:05Z","git_url":"git://github.com/giantswarm/azure-operator.git","ssh_url":"git@github.com:giantswarm/azure-operator.git","clone_url":"https://github.com/giantswarm/azure-operator.git","svn_url":"https://github.com/giantswarm/azure-operator","homepage":"","size":46487,"stargazers_count":10,"watchers_count":10,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":4,"mirror_url":null,"archived":false,"open_issues_count":9,"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":4,"open_issues":9,"watchers":10,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/giantswarm/azure-operator/pulls/278"},"html":{"href":"https://github.com/giantswarm/azure-operator/pull/278"},"issue":{"href":"https://api.github.com/repos/giantswarm/azure-operator/issues/278"},"comments":{"href":"https://api.github.com/repos/giantswarm/azure-operator/issues/278/comments"},"review_comments":{"href":"https://api.github.com/repos/giantswarm/azure-operator/pulls/278/comments"},"review_comment":{"href":"https://api.github.com/repos/giantswarm/azure-operator/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/giantswarm/azure-operator/pulls/278/commits"},"statuses":{"href":"https://api.github.com/repos/giantswarm/azure-operator/statuses/2807d8f179078fbfb6cca9bf5f01cfddb847c77b"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"xh3b4sd"}}