in agent/agent.go [331:370]
func gracefullyDrainEnvoyListeners(agentConfig config.AgentConfig) {
envoyListenerDrainUrl := fmt.Sprintf("%s://%s:%d%s?%s",
agentConfig.EnvoyServerScheme,
agentConfig.EnvoyServerHostName,
agentConfig.EnvoyServerAdminPort,
agentConfig.EnvoyListenerDrainUrl,
gracefulDrainQueryKey)
log.Infof("Draining Envoy listeners...")
req, _ := client.CreateRetryableAgentRequest(http.MethodPost, envoyListenerDrainUrl, nil)
httpClient, err := client.CreateRetryableHttpClientForEnvoyServer(agentConfig)
if err != nil {
log.Error("Unable to create Retryable Http Client: ", err)
return
}
res, err := httpClient.Do(req)
if err != nil {
log.Error("Unable to drain Envoy listeners: ", err)
return
}
defer res.Body.Close()
if res.StatusCode != http.StatusOK {
log.Errorf("Failed to drain Envoy listeners [response %d - %s]", res.StatusCode, res.Status)
return
}
responseData, err := ioutil.ReadAll(res.Body)
if err != nil {
// We received HTTP 200, so will wait for Envoy to drain
log.Warn("Unable to read drain response from Envoy: ", err)
}
responseContent := string(responseData)
// Logging this for sanity
log.Debugf("Response from drain listeners URL: %s", responseContent)
log.Infof("Waiting %ds for Envoy to drain listeners.", int(agentConfig.ListenerDrainWaitTime.Seconds()))
time.Sleep(agentConfig.ListenerDrainWaitTime)
}