Skip to content

Commit

Permalink
Add configurable httpd timeout
Browse files Browse the repository at this point in the history
This patch adds an apiTimeout field to the OctaviaSpecCore
to the already OctaviaSpec one to allow configure the timeouts
for HAProxy and Apache. Inherit from the controller in case
it is not specified by the user.

Also fixing *core* API spec version of the new
GetDefaultRouteAnnotations function.

Jira: https://issues.redhat.com/browse/OSPRH-6713
  • Loading branch information
Fernando Royo authored and gthiemonge committed Oct 28, 2024
1 parent 930f347 commit 42595b2
Show file tree
Hide file tree
Showing 10 changed files with 67 additions and 9 deletions.
4 changes: 4 additions & 0 deletions api/bases/octavia.openstack.org_octaviaapis.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,10 @@ spec:
spec:
description: OctaviaAPISpec defines the desired state of OctaviaAPI
properties:
apiTimeout:
description: APITimeout for HAProxy and Apache defaults to OctaviaSpecCore
APITimeout (seconds)
type: integer
containerImage:
description: Octavia Container Image URL
type: string
Expand Down
8 changes: 7 additions & 1 deletion api/bases/octavia.openstack.org_octavias.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,9 @@ spec:
description: Apache Container Image URL
type: string
apiTimeout:
default: 120
description: Octavia API timeout
type: string
type: integer
customServiceConfig:
default: '# add your customization here'
description: CustomServiceConfig - customize the service config using
Expand Down Expand Up @@ -150,6 +151,10 @@ spec:
description: OctaviaAPI - Spec definition for the API service of the
Octavia deployment
properties:
apiTimeout:
description: APITimeout for HAProxy and Apache defaults to OctaviaSpecCore
APITimeout (seconds)
type: integer
containerImage:
description: Octavia Container Image URL
type: string
Expand Down Expand Up @@ -1381,6 +1386,7 @@ spec:
type: string
required:
- apacheContainerImage
- apiTimeout
- databaseInstance
- octaviaAPI
- octaviaNetworkAttachment
Expand Down
11 changes: 7 additions & 4 deletions api/v1beta1/octavia_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ limitations under the License.
package v1beta1

import (
"fmt"

"github.com/openstack-k8s-operators/lib-common/modules/common/condition"
"github.com/openstack-k8s-operators/lib-common/modules/common/util"
corev1 "k8s.io/api/core/v1"
Expand All @@ -42,7 +44,7 @@ const (
ApacheContainerImage = "registry.redhat.io/ubi9/httpd-24:latest"

// Octavia API timeout
APITimeout = "120"
APITimeout = 120
)

// OctaviaSpec defines the desired state of Octavia
Expand Down Expand Up @@ -204,9 +206,10 @@ type OctaviaSpecBase struct {
// Apache Container Image URL
ApacheContainerImage string `json:"apacheContainerImage"`

// +kubebuilder:validation:Optional
// +kubebuilder:validation:Required
// +kubebuilder:default=120
// Octavia API timeout
APITimeout string `json:"apiTimeout,omitempty"`
APITimeout int `json:"apiTimeout"`

// +kubebuilder:validation:Required
// +kubebuilder:default=octavia
Expand Down Expand Up @@ -366,7 +369,7 @@ func SetupDefaults() {
HealthManagerContainerImageURL: util.GetEnvVar("RELATED_IMAGE_OCTAVIA_HEALTHMANAGER_IMAGE_URL_DEFAULT", OctaviaHealthManagerContainerImage),
WorkerContainerImageURL: util.GetEnvVar("RELATED_IMAGE_OCTAVIA_WORKER_IMAGE_URL_DEFAULT", OctaviaWorkerContainerImage),
ApacheContainerImageURL: util.GetEnvVar("RELATED_IMAGE_OCTAVIA_APACHE_IMAGE_URL_DEFAULT", ApacheContainerImage),
OctaviaAPIRouteTimeout: util.GetEnvVar("OCTAVIA_API_TIMEOUT", APITimeout),
OctaviaAPIRouteTimeout: util.GetEnvVar("OCTAVIA_API_TIMEOUT", fmt.Sprintf("%d", APITimeout)),
// No default for AmphoraImageContainerImageURL
}

Expand Down
31 changes: 28 additions & 3 deletions api/v1beta1/octavia_webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -198,9 +198,34 @@ func (r *Octavia) ValidateDelete() (admission.Warnings, error) {
return nil, nil
}

func (spec *OctaviaSpec) GetDefaultRouteAnnotations() (annotations map[string]string) {
annotations = map[string]string{
func (spec *OctaviaAPISpecCore) GetDefaultRouteAnnotations() (annotations map[string]string) {
return map[string]string{
"haproxy.router.openshift.io/timeout": octaviaDefaults.OctaviaAPIRouteTimeout,
}
return
}

// SetDefaultRouteAnnotations sets HAProxy timeout values of the route
func (octaviaAPI *OctaviaAPISpecCore) SetDefaultRouteAnnotations(annotations map[string]string) {
const haProxyAnno = "haproxy.router.openshift.io/timeout"
// Use a custom annotation to flag when the operator has set the default HAProxy timeout
// With the annotation func determines when to overwrite existing HAProxy timeout with the APITimeout
const octaviaAnno = "api.octavia.openstack.org/timeout"

valOctavia, okOctavia := annotations[octaviaAnno]
valHAProxy, okHAProxy := annotations[haProxyAnno]

// Human operator set the HAProxy timeout manually
if !okOctavia && okHAProxy {
return
}

// Human operator modified the HAProxy timeout manually without removing the Octavia flag
if okOctavia && okHAProxy && valOctavia != valHAProxy {
delete(annotations, octaviaAnno)
return
}

timeout := fmt.Sprintf("%ds", octaviaAPI.APITimeout)
annotations[octaviaAnno] = timeout
annotations[haProxyAnno] = timeout
}
4 changes: 4 additions & 0 deletions api/v1beta1/octaviaapi_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,10 @@ type OctaviaAPISpecCore struct {
// +operator-sdk:csv:customresourcedefinitions:type=spec
// TLS - Parameters related to the TLS
TLS OctaviaApiTLS `json:"tls,omitempty"`

// +kubebuilder:validation:Optional
// APITimeout for HAProxy and Apache defaults to OctaviaSpecCore APITimeout (seconds)
APITimeout int `json:"apiTimeout"`
}

type OctaviaApiTLS struct {
Expand Down
4 changes: 4 additions & 0 deletions config/crd/bases/octavia.openstack.org_octaviaapis.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,10 @@ spec:
spec:
description: OctaviaAPISpec defines the desired state of OctaviaAPI
properties:
apiTimeout:
description: APITimeout for HAProxy and Apache defaults to OctaviaSpecCore
APITimeout (seconds)
type: integer
containerImage:
description: Octavia Container Image URL
type: string
Expand Down
8 changes: 7 additions & 1 deletion config/crd/bases/octavia.openstack.org_octavias.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,9 @@ spec:
description: Apache Container Image URL
type: string
apiTimeout:
default: 120
description: Octavia API timeout
type: string
type: integer
customServiceConfig:
default: '# add your customization here'
description: CustomServiceConfig - customize the service config using
Expand Down Expand Up @@ -150,6 +151,10 @@ spec:
description: OctaviaAPI - Spec definition for the API service of the
Octavia deployment
properties:
apiTimeout:
description: APITimeout for HAProxy and Apache defaults to OctaviaSpecCore
APITimeout (seconds)
type: integer
containerImage:
description: Octavia Container Image URL
type: string
Expand Down Expand Up @@ -1381,6 +1386,7 @@ spec:
type: string
required:
- apacheContainerImage
- apiTimeout
- databaseInstance
- octaviaAPI
- octaviaNetworkAttachment
Expand Down
2 changes: 2 additions & 0 deletions controllers/octavia_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -1481,6 +1481,8 @@ func (r *OctaviaReconciler) apiDeploymentCreateOrUpdate(instance *octaviav1.Octa
deployment.Spec.Secret = instance.Spec.Secret
deployment.Spec.ServiceAccount = instance.RbacResourceName()
deployment.Spec.TLS = instance.Spec.OctaviaAPI.TLS
deployment.Spec.APITimeout = instance.Spec.APITimeout

if len(deployment.Spec.NodeSelector) == 0 {
deployment.Spec.NodeSelector = instance.Spec.NodeSelector
}
Expand Down
2 changes: 2 additions & 0 deletions controllers/octaviaapi_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -978,6 +978,8 @@ func (r *OctaviaAPIReconciler) generateServiceSecrets(
}
templateParameters["OVNDB_TLS"] = instance.Spec.TLS.Ovn.Enabled()

templateParameters["TimeOut"] = instance.Spec.APITimeout

// create httpd vhost template parameters
httpdVhostConfig := map[string]interface{}{}
for _, endpt := range []service.Endpoint{service.EndpointInternal, service.EndpointPublic} {
Expand Down
2 changes: 2 additions & 0 deletions templates/octaviaapi/config/httpd.conf
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ CustomLog /dev/stdout proxy env=forwarded
CustomLog /dev/stdout combined env=!forwarded
CustomLog /dev/stdout proxy env=forwarded

TimeOut {{ $.TimeOut }}

{{- if $vhost.TLS }}
SetEnvIf X-Forwarded-Proto https HTTPS=1

Expand Down

0 comments on commit 42595b2

Please sign in to comment.