{"action":"created","comment":{"url":"https://api.github.com/repos/logibit/Fakta/pulls/comments/61093298","id":61093298,"diff_hunk":"@@ -1,78 +1,389 @@\n ﻿/// Agent can be used to query the Agent endpoints\n module Fakta.Agent\n+open System\n+open System.Text\n+open Fakta\n+open Fakta.Logging\n+open Fakta.Impl\n+open System\n+open NodaTime\n+open HttpFs.Client\n+open Chiron\n \n /// CheckDeregister is used to deregister a check with the local agent\n let checkDeregister (state : FaktaState) (checkId : string) : Async<Choice<unit, Error>> =\n-  raise (TBD \"TODO\")\n+  let getResponse = Impl.getResponse state \"Fakta.Agent.check.deregister\"\n+  let req =\n+    UriBuilder.ofAgent state.config (sprintf \"check/deregister/%s\" checkId)\n+    |> UriBuilder.uri\n+    |> basicRequest Get\n+    |> withConfigOpts state.config\n+  async {\n+  let! resp, dur = Duration.timeAsync (fun () -> getResponse req)\n+  match resp with\n+  | Choice1Of2 resp ->\n+    use resp = resp\n+    if not (resp.StatusCode = 200 || resp.StatusCode = 404) then\n+      return Choice2Of2 (Message (sprintf \"unknown response code %d\" resp.StatusCode))\n+    else\n+      match resp.StatusCode with      \n+      | 200 -> return Choice1Of2 ()\n+      | _ ->  return Choice2Of2 (Message (sprintf \"agent.check.deregister value %s\" checkId))\n+\n+  | Choice2Of2 exx ->\n+    return Choice2Of2 (Error.ConnectionFailed exx)\n+}\n \n /// CheckRegister is used to register a new check with the local agent \n-let checkRegister (state : FaktaState) (checkId : string) : Async<Choice<unit, Error>> =\n-  raise (TBD \"TODO\")\n+let checkRegister (state : FaktaState) (checkRegistration : AgentCheckRegistration) : Async<Choice<unit, Error>> =\n+  let getResponse = Impl.getResponse state \"Fakta.Agent.check.register\"\n+  let serializedCheckReg = Json.serialize checkRegistration |> Json.format\n+  let req =\n+    UriBuilder.ofAgent state.config \"check/register\"\n+    |> UriBuilder.uri\n+    |> basicRequest HttpMethod.Put\n+    |> withConfigOpts state.config\n+    |> withJsonBody serializedCheckReg\n+  async {\n+  let! resp, dur = Duration.timeAsync (fun () -> getResponse req)\n+  match resp with\n+  | Choice1Of2 resp ->\n+    use resp = resp\n+    if not (resp.StatusCode = 200 || resp.StatusCode = 404) then\n+      return Choice2Of2 (Message (sprintf \"unknown response code %d\" resp.StatusCode))\n+    else\n+      match resp.StatusCode with      \n+      | 200 -> return Choice1Of2 ()\n+      | _ ->  return Choice2Of2 (Message (sprintf \"agent.check.register set %s\" checkRegistration.check.ttl.Value))\n+\n+  | Choice2Of2 exx ->\n+    return Choice2Of2 (Error.ConnectionFailed exx)\n+  }\n \n /// Checks returns the locally registered checks\n let checks (state : FaktaState) : Async<Choice<Map<string, AgentCheck>, Error>> =\n-  raise (TBD \"TODO\")\n+  let getResponse = Impl.getResponse state \"Fakta.Agent.checks\"\n+  let req =\n+    UriBuilder.ofAgent state.config \"checks\" \n+    |> UriBuilder.uri\n+    |> basicRequest Get\n+    |> withConfigOpts state.config\n+  async {\n+  let! resp, dur = Duration.timeAsync (fun () -> getResponse req)\n+  match resp with\n+  | Choice1Of2 resp ->\n+    use resp = resp\n+    if not (resp.StatusCode = 200 || resp.StatusCode = 404) then\n+      return Choice2Of2 (Message (sprintf \"unknown response code %d\" resp.StatusCode))\n+    else\n+      match resp.StatusCode with\n+      | 404 -> return Choice2Of2 (Message \"agent.Checks\")\n+      | _ ->\n+        let! body = Response.readBodyAsString resp\n+        let  item = if body = \"\" then Map.empty else Json.deserialize (Json.parse body)\n+        return Choice1Of2 (item)\n+\n+  | Choice2Of2 exx ->\n+    return Choice2Of2 (Error.ConnectionFailed exx)\n+}\n+  \n+let setNodeMaintenanceMode (state : FaktaState) (enable : bool) : Async<Choice<unit, Error>> =\n+  let getResponse = Impl.getResponse state \"Fakta.Agent.maintenance\"\n+  let req =\n+    UriBuilder.ofAgent state.config \"maintenance\"\n+    |> UriBuilder.uri\n+    |> basicRequest HttpMethod.Put\n+    |> withQueryStringItem \"enable\" (enable.ToString().ToLower())\n+    |> withConfigOpts state.config\n+  async {\n+  let! resp, dur = Duration.timeAsync (fun () -> getResponse req)\n+  match resp with\n+  | Choice1Of2 resp ->\n+    use resp = resp\n+    if not (resp.StatusCode = 200 || resp.StatusCode = 404) then\n+      return Choice2Of2 (Message (sprintf \"unknown response code %d\" resp.StatusCode))\n+    else\n+      match resp.StatusCode with      \n+      | 200 -> return Choice1Of2 ()\n+      | _ ->  return Choice2Of2 (Message (sprintf \"agent.maintenance set %b\" enable))\n+\n+  | Choice2Of2 exx ->\n+    return Choice2Of2 (Error.ConnectionFailed exx)\n+  }\n+\n+let setServiceMaintenanceMode (state : FaktaState) (enable : bool) (serviceId : string) : Async<Choice<unit, Error>> =\n+  let getResponse = Impl.getResponse state \"Fakta.Agent.service.maintenance\"\n+  let req =\n+    UriBuilder.ofAgent state.config (sprintf \"service/maintenance/%s\" serviceId)\n+    |> UriBuilder.uri\n+    |> basicRequest HttpMethod.Put\n+    |> withQueryStringItem \"enable\" (enable.ToString().ToLower())\n+    |> withConfigOpts state.config\n+  async {\n+  let! resp, dur = Duration.timeAsync (fun () -> getResponse req)\n+  match resp with\n+  | Choice1Of2 resp ->\n+    use resp = resp\n+    if not (resp.StatusCode = 200 || resp.StatusCode = 404) then\n+      return Choice2Of2 (Message (sprintf \"unknown response code %d\" resp.StatusCode))\n+    else\n+      match resp.StatusCode with      \n+      | 200 -> return Choice1Of2 ()\n+      | _ ->  return Choice2Of2 (Message (sprintf \"agent.maintenance set %b\" enable))\n+\n+  | Choice2Of2 exx ->\n+    return Choice2Of2 (Error.ConnectionFailed exx)\n+}\n \n /// DisableNodeMaintenance toggles node maintenance mode off for the agent we are connected to.\n let disableNodeMaintenance (state : FaktaState) : Async<Choice<unit, Error>> =\n-  raise (TBD \"TODO\")\n+  setNodeMaintenanceMode state false\n \n /// DisableServiceMaintenance toggles service maintenance mode off for the given service id.\n let disableServiceMaintenance (state : FaktaState) (serviceId : Id) : Async<Choice<unit, Error>> =\n-  raise (TBD \"TODO\")\n+  setServiceMaintenanceMode state false (serviceId.ToString())\n \n /// EnableNodeMaintenance toggles node maintenance mode on for the agent we are connected to.\n let enableNodeMaintenance (state : FaktaState) (reason : string) : Async<Choice<unit, Error>> =\n-  raise (TBD \"TODO\")\n+  setNodeMaintenanceMode state true\n \n /// EnableServiceMaintenance toggles service maintenance mode on for the given service id.\n let enableServiceMaintenance (state : FaktaState) (serviceId : Id) (reason : string) : Async<Choice<unit, Error>> =\n-  raise (TBD \"TODO\")\n-\n-/// FailTTL is used to set a TTL check to the failing state\n-let failTTL (state : FaktaState) (checkId : string) (note : string) : Async<Choice<unit, Error>> =\n-  raise (TBD \"TODO\")\n-\n-/// ForceLeave is used to have the agent eject a failed node\n-let forceLeave (state : FaktaState) (node : string) : Async<Choice<unit, Error>> =\n-  raise (TBD \"TODO\")\n+  setServiceMaintenanceMode state true (serviceId.ToString())\n \n /// Join is used to instruct the agent to attempt a join to another cluster member\n let join (state : FaktaState) (addr : string) (wan : bool) : Async<Choice<unit, Error>> =\n-  raise (TBD \"TODO\")\n+  let getResponse = Impl.getResponse state \"Fakta.Agent.join\"\n+  let req =\n+    UriBuilder.ofAgent state.config (sprintf \"join/%s\" addr)\n+    |> UriBuilder.uri\n+    |> basicRequest HttpMethod.Get\n+    |> withQueryStringItem \"wan\" (System.Convert.ToInt16(wan).ToString())\n+    |> withConfigOpts state.config\n+  async {\n+  let! resp, dur = Duration.timeAsync (fun () -> getResponse req)\n+  match resp with\n+  | Choice1Of2 resp ->\n+    use resp = resp\n+    if not (resp.StatusCode = 200 || resp.StatusCode = 404) then\n+      return Choice2Of2 (Message (sprintf \"unknown response code %d\" resp.StatusCode))\n+    else\n+      match resp.StatusCode with      \n+      | 200 -> return Choice1Of2 ()\n+      | _ ->  return Choice2Of2 (Message (sprintf \"agent.maintenance set %s\" addr))\n \n-/// Members returns the known gossip members. The WAN flag can be used to query a server for WAN members.\n-let members (state : FaktaState) (addr : string) (wan : bool) : Async<Choice<unit, Error>> =\n-  raise (TBD \"TODO\")\n+  | Choice2Of2 exx ->\n+    return Choice2Of2 (Error.ConnectionFailed exx)\n+}\n \n-/// NodeName is used to get the node name of the agent\n-let nodeName (state : FaktaState) : Async<Choice<string, Error>> =\n-  raise (TBD \"TODO\")\n+/// Members returns the known gossip members. The WAN flag can be used to query a server for WAN members.\n+let members (state : FaktaState) (wan : bool) : Async<Choice<AgentMember list, Error>> =\n+  let getResponse = Impl.getResponse state \"Fakta.Agent.members\"\n+  let req =\n+    UriBuilder.ofAgent state.config \"members\" \n+    |> UriBuilder.uri\n+    |> basicRequest Get\n+    |> withConfigOpts state.config\n+  async {\n+  let! resp, dur = Duration.timeAsync (fun () -> getResponse req)\n+  match resp with\n+  | Choice1Of2 resp ->\n+    use resp = resp\n+    if not (resp.StatusCode = 200 || resp.StatusCode = 404) then\n+      return Choice2Of2 (Message (sprintf \"unknown response code %d\" resp.StatusCode))\n+    else\n+      match resp.StatusCode with\n+      | 404 -> return Choice2Of2 (Message \"agent.members\")\n+      | _ ->\n+        let! body = Response.readBodyAsString resp\n+        let  item = if body = \"\" then [] else Json.deserialize (Json.parse body)\n+        return Choice1Of2 (item)\n \n-/// PassTTL is used to set a TTL check to the passing state\n-let passTTL (state : FaktaState) (checkId : string) (note : string) : Async<Choice<unit, Error>> =\n-  raise (TBD \"TODO\")\n+  | Choice2Of2 exx ->\n+    return Choice2Of2 (Error.ConnectionFailed exx)\n+}\n \n /// Self is used to query the agent we are speaking to for information about itself\n let self (state : FaktaState) : Async<Choice<Map<string, Map<string, Chiron.Json>>, Error>> =\n-  raise (TBD \"TODO\")\n+  let getResponse = Impl.getResponse state \"Fakta.Agent.self\"\n+  let req =\n+    UriBuilder.ofAgent state.config \"self\" \n+    |> UriBuilder.uri\n+    |> basicRequest Get\n+    |> withConfigOpts state.config\n+  async {\n+  let! resp, dur = Duration.timeAsync (fun () -> getResponse req)\n+  match resp with\n+  | Choice1Of2 resp ->\n+    use resp = resp\n+    if not (resp.StatusCode = 200 || resp.StatusCode = 404) then\n+      return Choice2Of2 (Message (sprintf \"unknown response code %d\" resp.StatusCode))\n+    else\n+      match resp.StatusCode with\n+      | 404 -> return Choice2Of2 (Message \"agent.self\")\n+      | _ ->\n+        let! body = Response.readBodyAsString resp\n+        let  item = if body = \"\" then Map.empty else Json.deserialize (Json.parse body)\n+        return Choice1Of2 (item)\n+\n+  | Choice2Of2 exx ->\n+    return Choice2Of2 (Error.ConnectionFailed exx)\n+}\n+\n+/// NodeName is used to get the node name of the agent\n+let nodeName (state : FaktaState) : Async<Choice<string, Error>> =\n+  async {    \n+    match Async.RunSynchronously (self state) with\n+    | Choice1Of2 map -> \n+        let r = match map.ContainsKey(\"Config\") with\n+                | true ->\n+                    let config = map.Item \"Config\"\n+                    match config.ContainsKey(\"NodeName\") with\n+                    | true -> \n+                        let nodeNameJson = config.Item \"NodeName\"","path":"src/Fakta/Agent.fs","position":null,"original_position":270,"commit_id":"fcc830ce4cc75a62f83f82485460539098cec6c3","original_commit_id":"273a2d7bde3c34a1b3af8d9280f188815a12ce35","user":{"login":"davidpodhola","id":436605,"avatar_url":"https://avatars.githubusercontent.com/u/436605?v=3","gravatar_id":"","url":"https://api.github.com/users/davidpodhola","html_url":"https://github.com/davidpodhola","followers_url":"https://api.github.com/users/davidpodhola/followers","following_url":"https://api.github.com/users/davidpodhola/following{/other_user}","gists_url":"https://api.github.com/users/davidpodhola/gists{/gist_id}","starred_url":"https://api.github.com/users/davidpodhola/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davidpodhola/subscriptions","organizations_url":"https://api.github.com/users/davidpodhola/orgs","repos_url":"https://api.github.com/users/davidpodhola/repos","events_url":"https://api.github.com/users/davidpodhola/events{/privacy}","received_events_url":"https://api.github.com/users/davidpodhola/received_events","type":"User","site_admin":false},"body":"Fixed, looks better, thanks!","created_at":"2016-04-26T14:18:16Z","updated_at":"2016-04-26T14:18:16Z","html_url":"https://github.com/logibit/Fakta/pull/25#discussion_r61093298","pull_request_url":"https://api.github.com/repos/logibit/Fakta/pulls/25","_links":{"self":{"href":"https://api.github.com/repos/logibit/Fakta/pulls/comments/61093298"},"html":{"href":"https://github.com/logibit/Fakta/pull/25#discussion_r61093298"},"pull_request":{"href":"https://api.github.com/repos/logibit/Fakta/pulls/25"}}},"pull_request":{"url":"https://api.github.com/repos/logibit/Fakta/pulls/25","id":66732806,"html_url":"https://github.com/logibit/Fakta/pull/25","diff_url":"https://github.com/logibit/Fakta/pull/25.diff","patch_url":"https://github.com/logibit/Fakta/pull/25.patch","issue_url":"https://api.github.com/repos/logibit/Fakta/issues/25","number":25,"state":"open","locked":false,"title":"Health done, Agent WIP","user":{"login":"davidpodhola","id":436605,"avatar_url":"https://avatars.githubusercontent.com/u/436605?v=3","gravatar_id":"","url":"https://api.github.com/users/davidpodhola","html_url":"https://github.com/davidpodhola","followers_url":"https://api.github.com/users/davidpodhola/followers","following_url":"https://api.github.com/users/davidpodhola/following{/other_user}","gists_url":"https://api.github.com/users/davidpodhola/gists{/gist_id}","starred_url":"https://api.github.com/users/davidpodhola/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davidpodhola/subscriptions","organizations_url":"https://api.github.com/users/davidpodhola/orgs","repos_url":"https://api.github.com/users/davidpodhola/repos","events_url":"https://api.github.com/users/davidpodhola/events{/privacy}","received_events_url":"https://api.github.com/users/davidpodhola/received_events","type":"User","site_admin":false},"body":"commented out tests throw 400","created_at":"2016-04-16T09:13:02Z","updated_at":"2016-04-26T14:18:17Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b4fedadf1abb1368eed99a0348c277bf27734997","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/logibit/Fakta/pulls/25/commits","review_comments_url":"https://api.github.com/repos/logibit/Fakta/pulls/25/comments","review_comment_url":"https://api.github.com/repos/logibit/Fakta/pulls/comments{/number}","comments_url":"https://api.github.com/repos/logibit/Fakta/issues/25/comments","statuses_url":"https://api.github.com/repos/logibit/Fakta/statuses/fcc830ce4cc75a62f83f82485460539098cec6c3","head":{"label":"LadyLeia:master","ref":"master","sha":"fcc830ce4cc75a62f83f82485460539098cec6c3","user":{"login":"LadyLeia","id":14977192,"avatar_url":"https://avatars.githubusercontent.com/u/14977192?v=3","gravatar_id":"","url":"https://api.github.com/users/LadyLeia","html_url":"https://github.com/LadyLeia","followers_url":"https://api.github.com/users/LadyLeia/followers","following_url":"https://api.github.com/users/LadyLeia/following{/other_user}","gists_url":"https://api.github.com/users/LadyLeia/gists{/gist_id}","starred_url":"https://api.github.com/users/LadyLeia/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LadyLeia/subscriptions","organizations_url":"https://api.github.com/users/LadyLeia/orgs","repos_url":"https://api.github.com/users/LadyLeia/repos","events_url":"https://api.github.com/users/LadyLeia/events{/privacy}","received_events_url":"https://api.github.com/users/LadyLeia/received_events","type":"User","site_admin":false},"repo":{"id":55617570,"name":"Fakta","full_name":"LadyLeia/Fakta","owner":{"login":"LadyLeia","id":14977192,"avatar_url":"https://avatars.githubusercontent.com/u/14977192?v=3","gravatar_id":"","url":"https://api.github.com/users/LadyLeia","html_url":"https://github.com/LadyLeia","followers_url":"https://api.github.com/users/LadyLeia/followers","following_url":"https://api.github.com/users/LadyLeia/following{/other_user}","gists_url":"https://api.github.com/users/LadyLeia/gists{/gist_id}","starred_url":"https://api.github.com/users/LadyLeia/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LadyLeia/subscriptions","organizations_url":"https://api.github.com/users/LadyLeia/orgs","repos_url":"https://api.github.com/users/LadyLeia/repos","events_url":"https://api.github.com/users/LadyLeia/events{/privacy}","received_events_url":"https://api.github.com/users/LadyLeia/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/LadyLeia/Fakta","description":"A Consul + Vault F# library","fork":true,"url":"https://api.github.com/repos/LadyLeia/Fakta","forks_url":"https://api.github.com/repos/LadyLeia/Fakta/forks","keys_url":"https://api.github.com/repos/LadyLeia/Fakta/keys{/key_id}","collaborators_url":"https://api.github.com/repos/LadyLeia/Fakta/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/LadyLeia/Fakta/teams","hooks_url":"https://api.github.com/repos/LadyLeia/Fakta/hooks","issue_events_url":"https://api.github.com/repos/LadyLeia/Fakta/issues/events{/number}","events_url":"https://api.github.com/repos/LadyLeia/Fakta/events","assignees_url":"https://api.github.com/repos/LadyLeia/Fakta/assignees{/user}","branches_url":"https://api.github.com/repos/LadyLeia/Fakta/branches{/branch}","tags_url":"https://api.github.com/repos/LadyLeia/Fakta/tags","blobs_url":"https://api.github.com/repos/LadyLeia/Fakta/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/LadyLeia/Fakta/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/LadyLeia/Fakta/git/refs{/sha}","trees_url":"https://api.github.com/repos/LadyLeia/Fakta/git/trees{/sha}","statuses_url":"https://api.github.com/repos/LadyLeia/Fakta/statuses/{sha}","languages_url":"https://api.github.com/repos/LadyLeia/Fakta/languages","stargazers_url":"https://api.github.com/repos/LadyLeia/Fakta/stargazers","contributors_url":"https://api.github.com/repos/LadyLeia/Fakta/contributors","subscribers_url":"https://api.github.com/repos/LadyLeia/Fakta/subscribers","subscription_url":"https://api.github.com/repos/LadyLeia/Fakta/subscription","commits_url":"https://api.github.com/repos/LadyLeia/Fakta/commits{/sha}","git_commits_url":"https://api.github.com/repos/LadyLeia/Fakta/git/commits{/sha}","comments_url":"https://api.github.com/repos/LadyLeia/Fakta/comments{/number}","issue_comment_url":"https://api.github.com/repos/LadyLeia/Fakta/issues/comments{/number}","contents_url":"https://api.github.com/repos/LadyLeia/Fakta/contents/{+path}","compare_url":"https://api.github.com/repos/LadyLeia/Fakta/compare/{base}...{head}","merges_url":"https://api.github.com/repos/LadyLeia/Fakta/merges","archive_url":"https://api.github.com/repos/LadyLeia/Fakta/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/LadyLeia/Fakta/downloads","issues_url":"https://api.github.com/repos/LadyLeia/Fakta/issues{/number}","pulls_url":"https://api.github.com/repos/LadyLeia/Fakta/pulls{/number}","milestones_url":"https://api.github.com/repos/LadyLeia/Fakta/milestones{/number}","notifications_url":"https://api.github.com/repos/LadyLeia/Fakta/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/LadyLeia/Fakta/labels{/name}","releases_url":"https://api.github.com/repos/LadyLeia/Fakta/releases{/id}","deployments_url":"https://api.github.com/repos/LadyLeia/Fakta/deployments","created_at":"2016-04-06T15:26:05Z","updated_at":"2016-04-06T15:26:06Z","pushed_at":"2016-04-26T13:59:52Z","git_url":"git://github.com/LadyLeia/Fakta.git","ssh_url":"git@github.com:LadyLeia/Fakta.git","clone_url":"https://github.com/LadyLeia/Fakta.git","svn_url":"https://github.com/LadyLeia/Fakta","homepage":"","size":119,"stargazers_count":0,"watchers_count":0,"language":"F#","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":1,"forks":1,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"logibit:master","ref":"master","sha":"47d280b6f8f8def7511da9b6d5e16651f6d09b10","user":{"login":"logibit","id":5843871,"avatar_url":"https://avatars.githubusercontent.com/u/5843871?v=3","gravatar_id":"","url":"https://api.github.com/users/logibit","html_url":"https://github.com/logibit","followers_url":"https://api.github.com/users/logibit/followers","following_url":"https://api.github.com/users/logibit/following{/other_user}","gists_url":"https://api.github.com/users/logibit/gists{/gist_id}","starred_url":"https://api.github.com/users/logibit/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/logibit/subscriptions","organizations_url":"https://api.github.com/users/logibit/orgs","repos_url":"https://api.github.com/users/logibit/repos","events_url":"https://api.github.com/users/logibit/events{/privacy}","received_events_url":"https://api.github.com/users/logibit/received_events","type":"Organization","site_admin":false},"repo":{"id":42728891,"name":"Fakta","full_name":"logibit/Fakta","owner":{"login":"logibit","id":5843871,"avatar_url":"https://avatars.githubusercontent.com/u/5843871?v=3","gravatar_id":"","url":"https://api.github.com/users/logibit","html_url":"https://github.com/logibit","followers_url":"https://api.github.com/users/logibit/followers","following_url":"https://api.github.com/users/logibit/following{/other_user}","gists_url":"https://api.github.com/users/logibit/gists{/gist_id}","starred_url":"https://api.github.com/users/logibit/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/logibit/subscriptions","organizations_url":"https://api.github.com/users/logibit/orgs","repos_url":"https://api.github.com/users/logibit/repos","events_url":"https://api.github.com/users/logibit/events{/privacy}","received_events_url":"https://api.github.com/users/logibit/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/logibit/Fakta","description":"A Consul + Vault F# library","fork":false,"url":"https://api.github.com/repos/logibit/Fakta","forks_url":"https://api.github.com/repos/logibit/Fakta/forks","keys_url":"https://api.github.com/repos/logibit/Fakta/keys{/key_id}","collaborators_url":"https://api.github.com/repos/logibit/Fakta/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/logibit/Fakta/teams","hooks_url":"https://api.github.com/repos/logibit/Fakta/hooks","issue_events_url":"https://api.github.com/repos/logibit/Fakta/issues/events{/number}","events_url":"https://api.github.com/repos/logibit/Fakta/events","assignees_url":"https://api.github.com/repos/logibit/Fakta/assignees{/user}","branches_url":"https://api.github.com/repos/logibit/Fakta/branches{/branch}","tags_url":"https://api.github.com/repos/logibit/Fakta/tags","blobs_url":"https://api.github.com/repos/logibit/Fakta/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/logibit/Fakta/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/logibit/Fakta/git/refs{/sha}","trees_url":"https://api.github.com/repos/logibit/Fakta/git/trees{/sha}","statuses_url":"https://api.github.com/repos/logibit/Fakta/statuses/{sha}","languages_url":"https://api.github.com/repos/logibit/Fakta/languages","stargazers_url":"https://api.github.com/repos/logibit/Fakta/stargazers","contributors_url":"https://api.github.com/repos/logibit/Fakta/contributors","subscribers_url":"https://api.github.com/repos/logibit/Fakta/subscribers","subscription_url":"https://api.github.com/repos/logibit/Fakta/subscription","commits_url":"https://api.github.com/repos/logibit/Fakta/commits{/sha}","git_commits_url":"https://api.github.com/repos/logibit/Fakta/git/commits{/sha}","comments_url":"https://api.github.com/repos/logibit/Fakta/comments{/number}","issue_comment_url":"https://api.github.com/repos/logibit/Fakta/issues/comments{/number}","contents_url":"https://api.github.com/repos/logibit/Fakta/contents/{+path}","compare_url":"https://api.github.com/repos/logibit/Fakta/compare/{base}...{head}","merges_url":"https://api.github.com/repos/logibit/Fakta/merges","archive_url":"https://api.github.com/repos/logibit/Fakta/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/logibit/Fakta/downloads","issues_url":"https://api.github.com/repos/logibit/Fakta/issues{/number}","pulls_url":"https://api.github.com/repos/logibit/Fakta/pulls{/number}","milestones_url":"https://api.github.com/repos/logibit/Fakta/milestones{/number}","notifications_url":"https://api.github.com/repos/logibit/Fakta/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/logibit/Fakta/labels{/name}","releases_url":"https://api.github.com/repos/logibit/Fakta/releases{/id}","deployments_url":"https://api.github.com/repos/logibit/Fakta/deployments","created_at":"2015-09-18T14:59:15Z","updated_at":"2016-04-18T18:51:20Z","pushed_at":"2016-04-25T13:32:08Z","git_url":"git://github.com/logibit/Fakta.git","ssh_url":"git@github.com:logibit/Fakta.git","clone_url":"https://github.com/logibit/Fakta.git","svn_url":"https://github.com/logibit/Fakta","homepage":"","size":53,"stargazers_count":8,"watchers_count":8,"language":"F#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":4,"mirror_url":null,"open_issues_count":25,"forks":4,"open_issues":25,"watchers":8,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/logibit/Fakta/pulls/25"},"html":{"href":"https://github.com/logibit/Fakta/pull/25"},"issue":{"href":"https://api.github.com/repos/logibit/Fakta/issues/25"},"comments":{"href":"https://api.github.com/repos/logibit/Fakta/issues/25/comments"},"review_comments":{"href":"https://api.github.com/repos/logibit/Fakta/pulls/25/comments"},"review_comment":{"href":"https://api.github.com/repos/logibit/Fakta/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/logibit/Fakta/pulls/25/commits"},"statuses":{"href":"https://api.github.com/repos/logibit/Fakta/statuses/fcc830ce4cc75a62f83f82485460539098cec6c3"}}}}