curl --request POST \
--url https://use.hoop.dev/api/sidecars/handshake \
--header 'Content-Type: application/json' \
--data '
{
"version": "1.0.0",
"applied_revision": "8f14e45fceea167a5a36dedd4bea2543",
"last_error": "the config file sent a config this build refuses: parse config: json: unknown field \"future_key\"",
"last_outcome": "applied",
"local_configuration": {}
}
'import requests
url = "https://use.hoop.dev/api/sidecars/handshake"
payload = {
"version": "1.0.0",
"applied_revision": "8f14e45fceea167a5a36dedd4bea2543",
"last_error": "the config file sent a config this build refuses: parse config: json: unknown field \"future_key\"",
"last_outcome": "applied",
"local_configuration": {}
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
version: '1.0.0',
applied_revision: '8f14e45fceea167a5a36dedd4bea2543',
last_error: 'the config file sent a config this build refuses: parse config: json: unknown field "future_key"',
last_outcome: 'applied',
local_configuration: {}
})
};
fetch('https://use.hoop.dev/api/sidecars/handshake', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://use.hoop.dev/api/sidecars/handshake",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'version' => '1.0.0',
'applied_revision' => '8f14e45fceea167a5a36dedd4bea2543',
'last_error' => 'the config file sent a config this build refuses: parse config: json: unknown field "future_key"',
'last_outcome' => 'applied',
'local_configuration' => [
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://use.hoop.dev/api/sidecars/handshake"
payload := strings.NewReader("{\n \"version\": \"1.0.0\",\n \"applied_revision\": \"8f14e45fceea167a5a36dedd4bea2543\",\n \"last_error\": \"the config file sent a config this build refuses: parse config: json: unknown field \\\"future_key\\\"\",\n \"last_outcome\": \"applied\",\n \"local_configuration\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://use.hoop.dev/api/sidecars/handshake")
.header("Content-Type", "application/json")
.body("{\n \"version\": \"1.0.0\",\n \"applied_revision\": \"8f14e45fceea167a5a36dedd4bea2543\",\n \"last_error\": \"the config file sent a config this build refuses: parse config: json: unknown field \\\"future_key\\\"\",\n \"last_outcome\": \"applied\",\n \"local_configuration\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://use.hoop.dev/api/sidecars/handshake")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"version\": \"1.0.0\",\n \"applied_revision\": \"8f14e45fceea167a5a36dedd4bea2543\",\n \"last_error\": \"the config file sent a config this build refuses: parse config: json: unknown field \\\"future_key\\\"\",\n \"last_outcome\": \"applied\",\n \"local_configuration\": {}\n}"
response = http.request(request)
puts response.read_body{}{
"message": "the error description"
}{
"message": "the error description"
}{
"message": "the error description"
}{
"message": "the error description"
}{
"message": "the error description"
}{
"message": "the error description"
}Sidecar Handshake
Authenticated with the hoop-sidecar-token or the hoop-sidecar-identity header, never both. Records the reported version and returns the configuration the sidecar must serve. A sidecar whose stored configuration sets load_from_disk receives only that flag and its license, and runs its own config file. A sidecar that sends local_configuration while no configuration is stored gets that answer too: the control plane stores the report and adopts it only when an admin sends load_from_disk false. Otherwise it answers 412 while no configuration with listeners is assigned, recording nothing: a sidecar that cannot run must not show up as recently seen. Answers 422 when the configuration uses a feature the hoop-sidecar-capabilities header does not list. The answer carries the organization’s license in its “license” key; the sidecar verifies that signature itself and the license is never stored per sidecar.
curl --request POST \
--url https://use.hoop.dev/api/sidecars/handshake \
--header 'Content-Type: application/json' \
--data '
{
"version": "1.0.0",
"applied_revision": "8f14e45fceea167a5a36dedd4bea2543",
"last_error": "the config file sent a config this build refuses: parse config: json: unknown field \"future_key\"",
"last_outcome": "applied",
"local_configuration": {}
}
'import requests
url = "https://use.hoop.dev/api/sidecars/handshake"
payload = {
"version": "1.0.0",
"applied_revision": "8f14e45fceea167a5a36dedd4bea2543",
"last_error": "the config file sent a config this build refuses: parse config: json: unknown field \"future_key\"",
"last_outcome": "applied",
"local_configuration": {}
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
version: '1.0.0',
applied_revision: '8f14e45fceea167a5a36dedd4bea2543',
last_error: 'the config file sent a config this build refuses: parse config: json: unknown field "future_key"',
last_outcome: 'applied',
local_configuration: {}
})
};
fetch('https://use.hoop.dev/api/sidecars/handshake', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://use.hoop.dev/api/sidecars/handshake",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'version' => '1.0.0',
'applied_revision' => '8f14e45fceea167a5a36dedd4bea2543',
'last_error' => 'the config file sent a config this build refuses: parse config: json: unknown field "future_key"',
'last_outcome' => 'applied',
'local_configuration' => [
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://use.hoop.dev/api/sidecars/handshake"
payload := strings.NewReader("{\n \"version\": \"1.0.0\",\n \"applied_revision\": \"8f14e45fceea167a5a36dedd4bea2543\",\n \"last_error\": \"the config file sent a config this build refuses: parse config: json: unknown field \\\"future_key\\\"\",\n \"last_outcome\": \"applied\",\n \"local_configuration\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://use.hoop.dev/api/sidecars/handshake")
.header("Content-Type", "application/json")
.body("{\n \"version\": \"1.0.0\",\n \"applied_revision\": \"8f14e45fceea167a5a36dedd4bea2543\",\n \"last_error\": \"the config file sent a config this build refuses: parse config: json: unknown field \\\"future_key\\\"\",\n \"last_outcome\": \"applied\",\n \"local_configuration\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://use.hoop.dev/api/sidecars/handshake")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"version\": \"1.0.0\",\n \"applied_revision\": \"8f14e45fceea167a5a36dedd4bea2543\",\n \"last_error\": \"the config file sent a config this build refuses: parse config: json: unknown field \\\"future_key\\\"\",\n \"last_outcome\": \"applied\",\n \"local_configuration\": {}\n}"
response = http.request(request)
puts response.read_body{}{
"message": "the error description"
}{
"message": "the error description"
}{
"message": "the error description"
}{
"message": "the error description"
}{
"message": "the error description"
}{
"message": "the error description"
}Headers
The token returned when the sidecar was created. Omit it when sending hoop-sidecar-identity.
A Kubernetes or Google service account JWT, raw, that a sidecar service account mapping allows. Omit it when sending hoop-sidecar-token.
Comma-separated served-document features this sidecar decodes, such as review_mode, and behaviours it has, such as session_events. Absent means a build too old to report.
Body
The request body resource
Version of the sidecar binary
"1.0.0"
AppliedRevision is the hoop-sidecar-config-revision of the last configuration this sidecar actually took on, which is not necessarily the last one it was served: a document it refused, or one needing a restart, leaves this at the revision still running.
Optional. A sidecar too old to report it, or one that has handled no document yet, sends nothing and is reported as unknown rather than as converged.
"8f14e45fceea167a5a36dedd4bea2543"
LastError is the reason, when LastOutcome is refused, restart or not_served. Shown on the sidecar page so an admin reads it without the sidecar's log.
Optional. A build from before the field sends nothing.
"the config file sent a config this build refuses: parse config: json: unknown field \"future_key\""
LastOutcome is what this sidecar concluded about that configuration: applied, restart, refused, unchanged or retry. It is the only way to tell a sidecar enforcing the current rules from one that refused them and kept the old ones while still handshaking on time. One more value is the control plane's own: not_served, when it refused to serve this build the configuration, with LastError saying why.
Optional, for the same reason as AppliedRevision.
"applied"
LocalConfiguration is the sidecar's config file, without license and control_plane_url, sent while the file is its source. For a sidecar with no stored configuration the control plane answers load_from_disk instead of 412, so the sidecar keeps its file until an admin moves the configuration. Optional: a build from before the field sends nothing and imports its file on the 412.
Response
OK
The response is of type object.
Was this page helpful?