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"
}
'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"
}
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'
})
};
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'
]),
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}")
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}")
.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}"
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. 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"
}
'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"
}
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'
})
};
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'
]),
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}")
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}")
.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}"
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"
Response
OK
The response is of type object.
Was this page helpful?