func gracefullyDrainEnvoyListeners()

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)
}