Skip to content

Commit

Permalink
examine nil pointer before applying configurations
Browse files Browse the repository at this point in the history
  • Loading branch information
freehan committed Mar 14, 2019
1 parent 3312b26 commit f929fd3
Showing 1 changed file with 25 additions and 5 deletions.
30 changes: 25 additions & 5 deletions pkg/healthchecks/healthchecks.go
Expand Up @@ -62,6 +62,11 @@ const (
// backends, the port or named port specified in the Backend Service is
// used for health checking.
UseServingPortSpecification = "USE_SERVING_PORT"

// TODO: revendor the GCE API go client so that this error will not be hit.
newHealthCheckErrorMessageTemplate = "the %v health check configuration on the existing health check %v is nil. " +
"This is usually caused by an application protocol change on the k8s service spec. " +
"Please revert the change on application protocol to avoid this error message."
)

// HealthChecks manages health checks.
Expand Down Expand Up @@ -241,7 +246,10 @@ func (h *HealthChecks) Get(name string, version meta.Version) (*HealthCheck, err
default:
return nil, fmt.Errorf("unknown version %v", version)
}
return NewHealthCheck(hc), err
if err != nil {
return nil, err
}
return NewHealthCheck(hc)
}

// DefaultHealthCheck simply returns the default health check.
Expand Down Expand Up @@ -304,18 +312,30 @@ type HealthCheck struct {
}

// NewHealthCheck creates a HealthCheck which abstracts nested structs away
func NewHealthCheck(hc *computealpha.HealthCheck) *HealthCheck {
func NewHealthCheck(hc *computealpha.HealthCheck) (*HealthCheck, error) {
if hc == nil {
return nil
return nil, nil
}

v := &HealthCheck{HealthCheck: *hc}
var err error
switch annotations.AppProtocol(hc.Type) {
case annotations.ProtocolHTTP:
if hc.HttpHealthCheck == nil {
err = fmt.Errorf(newHealthCheckErrorMessageTemplate, annotations.ProtocolHTTP, hc.Name)
return nil, err
}
v.HTTPHealthCheck = *hc.HttpHealthCheck
case annotations.ProtocolHTTPS:
if hc.HttpsHealthCheck == nil {
err = fmt.Errorf(newHealthCheckErrorMessageTemplate, annotations.ProtocolHTTPS, hc.Name)
return nil, err
}
v.HTTPHealthCheck = computealpha.HTTPHealthCheck(*hc.HttpsHealthCheck)
case annotations.ProtocolHTTP2:
if hc.Http2HealthCheck == nil {
err = fmt.Errorf(newHealthCheckErrorMessageTemplate, annotations.ProtocolHTTP2, hc.Name)
return nil, err
}
v.HTTPHealthCheck = computealpha.HTTPHealthCheck(*hc.Http2HealthCheck)
}

Expand All @@ -325,7 +345,7 @@ func NewHealthCheck(hc *computealpha.HealthCheck) *HealthCheck {
v.HealthCheck.HttpsHealthCheck = nil
v.HealthCheck.Http2HealthCheck = nil

return v
return v, err
}

// Protocol returns the type cased to AppProtocol
Expand Down

0 comments on commit f929fd3

Please sign in to comment.