{"action":"created","comment":{"url":"https://api.github.com/repos/juju/juju/pulls/comments/24880677","id":24880677,"diff_hunk":"@@ -0,0 +1,338 @@\n+// Copyright 2015 Canonical Ltd.\n+// Licensed under the AGPLv3, see LICENCE file for details.\n+\n+package params\n+\n+import (\n+\t\"github.com/juju/juju/network\"\n+)\n+\n+// params types.\n+\n+// Network describes a single network available on an instance.\n+type Network struct {\n+\t// Tag is the network's tag.\n+\tTag string `json:\"Tag\"`\n+\n+\t// ProviderId is the provider-specific network id.\n+\tProviderId string `json:\"ProviderId\"`\n+\n+\t// CIDR of the network, in \"123.45.67.89/12\" format.\n+\tCIDR string `json:\"CIDR\"`\n+\n+\t// VLANTag needs to be between 1 and 4094 for VLANs and 0 for\n+\t// normal networks. It's defined by IEEE 802.1Q standard.\n+\tVLANTag int `json:\"VLANTag\"`\n+}\n+\n+// NetworkInterface describes a single network interface available on\n+// an instance.\n+type NetworkInterface struct {\n+\t// MACAddress is the network interface's hardware MAC address\n+\t// (e.g. \"aa:bb:cc:dd:ee:ff\").\n+\tMACAddress string `json:\"MACAddress\"`\n+\n+\t// InterfaceName is the OS-specific network device name (e.g.\n+\t// \"eth1\", even for for a VLAN eth1.42 virtual interface).\n+\tInterfaceName string `json:\"InterfaceName\"`\n+\n+\t// NetworkTag is this interface's network tag.\n+\tNetworkTag string `json:\"NetworkTag\"`\n+\n+\t// IsVirtual is true when the interface is a virtual device, as\n+\t// opposed to a physical device.\n+\tIsVirtual bool `json:\"IsVirtual\"`\n+\n+\t// Disabled returns whether the interface is disabled.\n+\tDisabled bool `json:\"Disabled\"`\n+}\n+\n+// NetworkConfig describes all the necessary information to configure\n+// all network interfaces on a machine. This mostly duplicates\n+// network.InterfaceInfo type and it's defined here so it can be kept\n+// separate and stable as definition to ensure proper wire-format for\n+// the API.\n+type NetworkConfig struct {\n+\t// DeviceIndex specifies the order in which the network interface\n+\t// appears on the host. The primary interface has an index of 0.\n+\tDeviceIndex int\n+\n+\t// MACAddress is the network interface's hardware MAC address\n+\t// (e.g. \"aa:bb:cc:dd:ee:ff\").\n+\tMACAddress string\n+\n+\t// CIDR of the network, in 123.45.67.89/24 format.\n+\tCIDR string\n+\n+\t// NetworkName is juju-internal name of the network.\n+\t// TODO(dimitern) This should be removed or adapted to the model\n+\t// once spaces are introduced.\n+\tNetworkName string\n+\n+\t// ProviderId is a provider-specific network id.\n+\tProviderId string\n+\n+\t// VLANTag needs to be between 1 and 4094 for VLANs and 0 for\n+\t// normal networks. It's defined by IEEE 802.1Q standard.\n+\tVLANTag int\n+\n+\t// InterfaceName is the raw OS-specific network device name (e.g.\n+\t// \"eth1\", even for a VLAN eth1.42 virtual interface).\n+\tInterfaceName string\n+\n+\t// Disabled is true when the interface needs to be disabled on the\n+\t// machine, e.g. not to configure it at all or stop it if running.\n+\tDisabled bool\n+\n+\t// NoAutoStart is true when the interface should not be configured\n+\t// to start automatically on boot. By default and for\n+\t// backwards-compatibility, interfaces are configured to\n+\t// auto-start.\n+\tNoAutoStart bool `json:\",omitempty\"`\n+\n+\t// ConfigType, if set, defines what type of configuration to use.\n+\t// See network.InterfaceConfigType for more info. If not set, for\n+\t// backwards-compatibility, \"dhcp\" is assumed.\n+\tConfigType string `json:\",omitempty\"`\n+\n+\t// Address contains an optional static IP address to configure for\n+\t// this network interface. The subnet mask to set will be inferred\n+\t// from the CIDR value.\n+\tAddress string `json:\",omitempty\"`\n+\n+\t// DNSServers contains an optional list of IP addresses and/or\n+\t// hostnames to configure as DNS servers for this network\n+\t// interface.\n+\tDNSServers []string `json:\",omitempty\"`\n+\n+\t// Gateway address, if set, defines the default gateway to\n+\t// configure for this network interface. For containers this\n+\t// usually (one of) the host address(es).\n+\tGatewayAddress string `json:\",omitempty\"`\n+\n+\t// ExtraConfig can contain any valid setting and its value allowed\n+\t// inside an \"iface\" section of a interfaces(5) config file, e.g.\n+\t// \"up\", \"down\", \"mtu\", etc.\n+\tExtraConfig map[string]string `json:\",omitempty\"`\n+}\n+\n+// Port encapsulates a protocol and port number. It is used in API\n+// requests/responses. See also network.Port, from/to which this is\n+// transformed.\n+type Port struct {\n+\tProtocol string `json:\"Protocol\"`\n+\tNumber   int    `json:\"Number\"`\n+}\n+\n+// FromNetworkPort is a convenience helper to create a parameter\n+// out of the network type, here for Port.\n+func FromNetworkPort(p network.Port) Port {\n+\treturn Port{\n+\t\tProtocol: p.Protocol,\n+\t\tNumber:   p.Number,\n+\t}\n+}\n+\n+// NetworkPort is a convenience helper to return the parameter\n+// as network type, here for Port.\n+func (p Port) NetworkPort() network.Port {\n+\treturn network.Port{\n+\t\tProtocol: p.Protocol,\n+\t\tNumber:   p.Number,\n+\t}\n+}\n+\n+// PortRange represents a single range of ports. It is used in API\n+// requests/responses. See also network.PortRange, from/to which this is\n+// transformed.\n+type PortRange struct {\n+\tFromPort int    `json:\"FromPort\"`\n+\tToPort   int    `json:\"ToPort\"`\n+\tProtocol string `json:\"Protocol\"`\n+}\n+\n+// FromNetworkPortRange is a convenience helper to create a parameter\n+// out of the network type, here for PortRange.\n+func FromNetworkPortRange(pr network.PortRange) PortRange {\n+\treturn PortRange{\n+\t\tFromPort: pr.FromPort,\n+\t\tToPort:   pr.ToPort,\n+\t\tProtocol: pr.Protocol,\n+\t}\n+}\n+\n+// NetworkPortRange is a convenience helper to return the parameter\n+// as network type, here for PortRange.\n+func (pr PortRange) NetworkPortRange() network.PortRange {\n+\treturn network.PortRange{\n+\t\tFromPort: pr.FromPort,\n+\t\tToPort:   pr.ToPort,\n+\t\tProtocol: pr.Protocol,\n+\t}\n+}\n+\n+// Address represents the location of a machine, including metadata\n+// about what kind of location the address describes. It's used in\n+// the API requests/responses. See also network.Address, from/to\n+// which this is transformed.\n+type Address struct {\n+\tValue       string `json:\"Value\"`\n+\tType        string `json:\"Type\"`\n+\tNetworkName string `json:\"NetworkName\"`\n+\tScope       string `json:\"Scope\"`\n+}\n+\n+// FromNetworkAddress is a convenience helper to create a parameter\n+// out of the network type, here for Address.\n+func FromNetworkAddress(naddr network.Address) Address {\n+\treturn Address{\n+\t\tValue:       naddr.Value,\n+\t\tType:        string(naddr.Type),\n+\t\tNetworkName: naddr.NetworkName,\n+\t\tScope:       string(naddr.Scope),\n+\t}\n+}\n+\n+// NetworkAddress is a convenience helper to return the parameter\n+// as network type, here for Address.\n+func (addr Address) NetworkAddress() network.Address {\n+\treturn network.Address{\n+\t\tValue:       addr.Value,\n+\t\tType:        network.AddressType(addr.Type),\n+\t\tNetworkName: addr.NetworkName,\n+\t\tScope:       network.Scope(addr.Scope),\n+\t}\n+}\n+\n+// FromNetworkAddresses is a convenience helper to create a parameter\n+// out of the network type, here for a slice of Address.\n+func FromNetworkAddresses(naddrs []network.Address) []Address {\n+\taddrs := make([]Address, len(naddrs))\n+\tfor i, naddr := range naddrs {\n+\t\taddrs[i] = FromNetworkAddress(naddr)\n+\t}\n+\treturn addrs\n+}\n+\n+// NetworkAddresses is a convenience helper to return the parameter\n+// as network type, here for a slice of Address.\n+func NetworkAddresses(addrs []Address) []network.Address {\n+\tnaddrs := make([]network.Address, len(addrs))\n+\tfor i, addr := range addrs {\n+\t\tnaddrs[i] = addr.NetworkAddress()\n+\t}\n+\treturn naddrs\n+}\n+\n+// HostPort associates an address with a port. It's used in\n+// the API requests/responses. See also network.HostPort, from/to\n+// which this is transformed.\n+type HostPort struct {\n+\tAddress\n+\tPort int `json:\"Port\"`\n+}\n+\n+// FromNetworkHostPort is a convenience helper to create a parameter\n+// out of the network type, here for HostPort.\n+func FromNetworkHostPort(nhp network.HostPort) HostPort {\n+\treturn HostPort{FromNetworkAddress(nhp.Address), nhp.Port}\n+}\n+\n+// NetworkHostPort is a convenience helper to return the parameter\n+// as network type, here for HostPort.\n+func (hp HostPort) NetworkHostPort() network.HostPort {\n+\treturn network.HostPort{hp.Address.NetworkAddress(), hp.Port}\n+}\n+\n+// FromNetworkHostPorts is a helper to create a parameter\n+// out of the network type, here for a slice of HostPort.\n+func FromNetworkHostPorts(nhps []network.HostPort) []HostPort {\n+\thps := make([]HostPort, len(nhps))\n+\tfor i, nhp := range nhps {\n+\t\thps[i] = FromNetworkHostPort(nhp)\n+\t}\n+\treturn hps\n+}\n+\n+// NetworkHostPorts is a convenience helper to return the parameter\n+// as network type, here for a slice of HostPort.\n+func NetworkHostPorts(hps []HostPort) []network.HostPort {\n+\tnhps := make([]network.HostPort, len(hps))\n+\tfor i, hp := range hps {\n+\t\tnhps[i] = hp.NetworkHostPort()\n+\t}\n+\treturn nhps\n+}\n+\n+// FromNetworkHostPortMatrix is a helper to create a parameter","path":"apiserver/params/network.go","position":267,"original_position":267,"commit_id":"1bdebafcc9f3e5fcb3bf3ce529e92ca0e0d7c509","original_commit_id":"1bdebafcc9f3e5fcb3bf3ce529e92ca0e0d7c509","user":{"login":"dimitern","id":619986,"avatar_url":"https://avatars.githubusercontent.com/u/619986?v=3","gravatar_id":"","url":"https://api.github.com/users/dimitern","html_url":"https://github.com/dimitern","followers_url":"https://api.github.com/users/dimitern/followers","following_url":"https://api.github.com/users/dimitern/following{/other_user}","gists_url":"https://api.github.com/users/dimitern/gists{/gist_id}","starred_url":"https://api.github.com/users/dimitern/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dimitern/subscriptions","organizations_url":"https://api.github.com/users/dimitern/orgs","repos_url":"https://api.github.com/users/dimitern/repos","events_url":"https://api.github.com/users/dimitern/events{/privacy}","received_events_url":"https://api.github.com/users/dimitern/received_events","type":"User","site_admin":false},"body":"Rather than \"matrix\", I'd suggest calling this FromNetworkHostsPorts (and renaming the next one similarly) - it's more common in params and also in some other places in the code.","created_at":"2015-02-18T06:02:00Z","updated_at":"2015-02-18T06:02:00Z","html_url":"https://github.com/juju/juju/pull/1617#discussion_r24880677","pull_request_url":"https://api.github.com/repos/juju/juju/pulls/1617","_links":{"self":{"href":"https://api.github.com/repos/juju/juju/pulls/comments/24880677"},"html":{"href":"https://github.com/juju/juju/pull/1617#discussion_r24880677"},"pull_request":{"href":"https://api.github.com/repos/juju/juju/pulls/1617"}}},"pull_request":{"url":"https://api.github.com/repos/juju/juju/pulls/1617","id":29473664,"html_url":"https://github.com/juju/juju/pull/1617","diff_url":"https://github.com/juju/juju/pull/1617.diff","patch_url":"https://github.com/juju/juju/pull/1617.patch","issue_url":"https://api.github.com/repos/juju/juju/issues/1617","number":1617,"state":"open","locked":false,"title":"Cleanup of network parameters","user":{"login":"TheMue","id":1633981,"avatar_url":"https://avatars.githubusercontent.com/u/1633981?v=3","gravatar_id":"","url":"https://api.github.com/users/TheMue","html_url":"https://github.com/TheMue","followers_url":"https://api.github.com/users/TheMue/followers","following_url":"https://api.github.com/users/TheMue/following{/other_user}","gists_url":"https://api.github.com/users/TheMue/gists{/gist_id}","starred_url":"https://api.github.com/users/TheMue/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/TheMue/subscriptions","organizations_url":"https://api.github.com/users/TheMue/orgs","repos_url":"https://api.github.com/users/TheMue/repos","events_url":"https://api.github.com/users/TheMue/events{/privacy}","received_events_url":"https://api.github.com/users/TheMue/received_events","type":"User","site_admin":false},"body":"The package `apiserver/params` currently contains direct field references to the `networking` package. A cleaner separation is wanted, so the types are now duplicated inside `params` and contain convenience functions and methods to convert from and to `networking`. Those are now used where needed.\r\n\r\nAdditionally all networking related code is now in a file `network.go`, the tests in the file `network_test.go`. Here the old tests didn't checked the correct marshalling. This has be changed too.\r\n\r\nAs third step the type `NetworkInfo` is now renamed into `NetworkConfig`. Depending functions, fields, types inside the API are renamed too. Others have to be renamed in a following change, otherwise this grows too much.\n\n(Review request: http://reviews.vapour.ws/r/947/)","created_at":"2015-02-17T20:14:35Z","updated_at":"2015-02-18T06:02:00Z","closed_at":null,"merged_at":null,"merge_commit_sha":"96cb0890dd738803094a32ec127a7e71a06f3b76","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/juju/juju/pulls/1617/commits","review_comments_url":"https://api.github.com/repos/juju/juju/pulls/1617/comments","review_comment_url":"https://api.github.com/repos/juju/juju/pulls/comments/{number}","comments_url":"https://api.github.com/repos/juju/juju/issues/1617/comments","statuses_url":"https://api.github.com/repos/juju/juju/statuses/1bdebafcc9f3e5fcb3bf3ce529e92ca0e0d7c509","head":{"label":"TheMue:networking-cleanup-params","ref":"networking-cleanup-params","sha":"1bdebafcc9f3e5fcb3bf3ce529e92ca0e0d7c509","user":{"login":"TheMue","id":1633981,"avatar_url":"https://avatars.githubusercontent.com/u/1633981?v=3","gravatar_id":"","url":"https://api.github.com/users/TheMue","html_url":"https://github.com/TheMue","followers_url":"https://api.github.com/users/TheMue/followers","following_url":"https://api.github.com/users/TheMue/following{/other_user}","gists_url":"https://api.github.com/users/TheMue/gists{/gist_id}","starred_url":"https://api.github.com/users/TheMue/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/TheMue/subscriptions","organizations_url":"https://api.github.com/users/TheMue/orgs","repos_url":"https://api.github.com/users/TheMue/repos","events_url":"https://api.github.com/users/TheMue/events{/privacy}","received_events_url":"https://api.github.com/users/TheMue/received_events","type":"User","site_admin":false},"repo":{"id":20520922,"name":"juju","full_name":"TheMue/juju","owner":{"login":"TheMue","id":1633981,"avatar_url":"https://avatars.githubusercontent.com/u/1633981?v=3","gravatar_id":"","url":"https://api.github.com/users/TheMue","html_url":"https://github.com/TheMue","followers_url":"https://api.github.com/users/TheMue/followers","following_url":"https://api.github.com/users/TheMue/following{/other_user}","gists_url":"https://api.github.com/users/TheMue/gists{/gist_id}","starred_url":"https://api.github.com/users/TheMue/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/TheMue/subscriptions","organizations_url":"https://api.github.com/users/TheMue/orgs","repos_url":"https://api.github.com/users/TheMue/repos","events_url":"https://api.github.com/users/TheMue/events{/privacy}","received_events_url":"https://api.github.com/users/TheMue/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/TheMue/juju","description":"juju is devops distilled","fork":true,"url":"https://api.github.com/repos/TheMue/juju","forks_url":"https://api.github.com/repos/TheMue/juju/forks","keys_url":"https://api.github.com/repos/TheMue/juju/keys{/key_id}","collaborators_url":"https://api.github.com/repos/TheMue/juju/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/TheMue/juju/teams","hooks_url":"https://api.github.com/repos/TheMue/juju/hooks","issue_events_url":"https://api.github.com/repos/TheMue/juju/issues/events{/number}","events_url":"https://api.github.com/repos/TheMue/juju/events","assignees_url":"https://api.github.com/repos/TheMue/juju/assignees{/user}","branches_url":"https://api.github.com/repos/TheMue/juju/branches{/branch}","tags_url":"https://api.github.com/repos/TheMue/juju/tags","blobs_url":"https://api.github.com/repos/TheMue/juju/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/TheMue/juju/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/TheMue/juju/git/refs{/sha}","trees_url":"https://api.github.com/repos/TheMue/juju/git/trees{/sha}","statuses_url":"https://api.github.com/repos/TheMue/juju/statuses/{sha}","languages_url":"https://api.github.com/repos/TheMue/juju/languages","stargazers_url":"https://api.github.com/repos/TheMue/juju/stargazers","contributors_url":"https://api.github.com/repos/TheMue/juju/contributors","subscribers_url":"https://api.github.com/repos/TheMue/juju/subscribers","subscription_url":"https://api.github.com/repos/TheMue/juju/subscription","commits_url":"https://api.github.com/repos/TheMue/juju/commits{/sha}","git_commits_url":"https://api.github.com/repos/TheMue/juju/git/commits{/sha}","comments_url":"https://api.github.com/repos/TheMue/juju/comments{/number}","issue_comment_url":"https://api.github.com/repos/TheMue/juju/issues/comments/{number}","contents_url":"https://api.github.com/repos/TheMue/juju/contents/{+path}","compare_url":"https://api.github.com/repos/TheMue/juju/compare/{base}...{head}","merges_url":"https://api.github.com/repos/TheMue/juju/merges","archive_url":"https://api.github.com/repos/TheMue/juju/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/TheMue/juju/downloads","issues_url":"https://api.github.com/repos/TheMue/juju/issues{/number}","pulls_url":"https://api.github.com/repos/TheMue/juju/pulls{/number}","milestones_url":"https://api.github.com/repos/TheMue/juju/milestones{/number}","notifications_url":"https://api.github.com/repos/TheMue/juju/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/TheMue/juju/labels{/name}","releases_url":"https://api.github.com/repos/TheMue/juju/releases{/id}","created_at":"2014-06-05T10:25:39Z","updated_at":"2015-02-17T16:59:19Z","pushed_at":"2015-02-17T19:59:39Z","git_url":"git://github.com/TheMue/juju.git","ssh_url":"git@github.com:TheMue/juju.git","clone_url":"https://github.com/TheMue/juju.git","svn_url":"https://github.com/TheMue/juju","homepage":"juju.ubuntu.com","size":42215,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"juju:master","ref":"master","sha":"690fb9f25fc84e2f86f3be4cbcfd55ebad96cf0d","user":{"login":"juju","id":4604548,"avatar_url":"https://avatars.githubusercontent.com/u/4604548?v=3","gravatar_id":"","url":"https://api.github.com/users/juju","html_url":"https://github.com/juju","followers_url":"https://api.github.com/users/juju/followers","following_url":"https://api.github.com/users/juju/following{/other_user}","gists_url":"https://api.github.com/users/juju/gists{/gist_id}","starred_url":"https://api.github.com/users/juju/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/juju/subscriptions","organizations_url":"https://api.github.com/users/juju/orgs","repos_url":"https://api.github.com/users/juju/repos","events_url":"https://api.github.com/users/juju/events{/privacy}","received_events_url":"https://api.github.com/users/juju/received_events","type":"Organization","site_admin":false},"repo":{"id":20445947,"name":"juju","full_name":"juju/juju","owner":{"login":"juju","id":4604548,"avatar_url":"https://avatars.githubusercontent.com/u/4604548?v=3","gravatar_id":"","url":"https://api.github.com/users/juju","html_url":"https://github.com/juju","followers_url":"https://api.github.com/users/juju/followers","following_url":"https://api.github.com/users/juju/following{/other_user}","gists_url":"https://api.github.com/users/juju/gists{/gist_id}","starred_url":"https://api.github.com/users/juju/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/juju/subscriptions","organizations_url":"https://api.github.com/users/juju/orgs","repos_url":"https://api.github.com/users/juju/repos","events_url":"https://api.github.com/users/juju/events{/privacy}","received_events_url":"https://api.github.com/users/juju/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/juju/juju","description":"juju is devops distilled","fork":false,"url":"https://api.github.com/repos/juju/juju","forks_url":"https://api.github.com/repos/juju/juju/forks","keys_url":"https://api.github.com/repos/juju/juju/keys{/key_id}","collaborators_url":"https://api.github.com/repos/juju/juju/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/juju/juju/teams","hooks_url":"https://api.github.com/repos/juju/juju/hooks","issue_events_url":"https://api.github.com/repos/juju/juju/issues/events{/number}","events_url":"https://api.github.com/repos/juju/juju/events","assignees_url":"https://api.github.com/repos/juju/juju/assignees{/user}","branches_url":"https://api.github.com/repos/juju/juju/branches{/branch}","tags_url":"https://api.github.com/repos/juju/juju/tags","blobs_url":"https://api.github.com/repos/juju/juju/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/juju/juju/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/juju/juju/git/refs{/sha}","trees_url":"https://api.github.com/repos/juju/juju/git/trees{/sha}","statuses_url":"https://api.github.com/repos/juju/juju/statuses/{sha}","languages_url":"https://api.github.com/repos/juju/juju/languages","stargazers_url":"https://api.github.com/repos/juju/juju/stargazers","contributors_url":"https://api.github.com/repos/juju/juju/contributors","subscribers_url":"https://api.github.com/repos/juju/juju/subscribers","subscription_url":"https://api.github.com/repos/juju/juju/subscription","commits_url":"https://api.github.com/repos/juju/juju/commits{/sha}","git_commits_url":"https://api.github.com/repos/juju/juju/git/commits{/sha}","comments_url":"https://api.github.com/repos/juju/juju/comments{/number}","issue_comment_url":"https://api.github.com/repos/juju/juju/issues/comments/{number}","contents_url":"https://api.github.com/repos/juju/juju/contents/{+path}","compare_url":"https://api.github.com/repos/juju/juju/compare/{base}...{head}","merges_url":"https://api.github.com/repos/juju/juju/merges","archive_url":"https://api.github.com/repos/juju/juju/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/juju/juju/downloads","issues_url":"https://api.github.com/repos/juju/juju/issues{/number}","pulls_url":"https://api.github.com/repos/juju/juju/pulls{/number}","milestones_url":"https://api.github.com/repos/juju/juju/milestones{/number}","notifications_url":"https://api.github.com/repos/juju/juju/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/juju/juju/labels{/name}","releases_url":"https://api.github.com/repos/juju/juju/releases{/id}","created_at":"2014-06-03T14:28:10Z","updated_at":"2015-02-18T02:39:17Z","pushed_at":"2015-02-18T02:39:17Z","git_url":"git://github.com/juju/juju.git","ssh_url":"git@github.com:juju/juju.git","clone_url":"https://github.com/juju/juju.git","svn_url":"https://github.com/juju/juju","homepage":"juju.ubuntu.com","size":57688,"stargazers_count":243,"watchers_count":243,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":81,"mirror_url":null,"open_issues_count":65,"forks":81,"open_issues":65,"watchers":243,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/juju/juju/pulls/1617"},"html":{"href":"https://github.com/juju/juju/pull/1617"},"issue":{"href":"https://api.github.com/repos/juju/juju/issues/1617"},"comments":{"href":"https://api.github.com/repos/juju/juju/issues/1617/comments"},"review_comments":{"href":"https://api.github.com/repos/juju/juju/pulls/1617/comments"},"review_comment":{"href":"https://api.github.com/repos/juju/juju/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/juju/juju/pulls/1617/commits"},"statuses":{"href":"https://api.github.com/repos/juju/juju/statuses/1bdebafcc9f3e5fcb3bf3ce529e92ca0e0d7c509"}}}}