Commit e4602eb6 authored by Tim Hockin's avatar Tim Hockin

Merge pull request #6663 from justinsb/cleanup_service_ip

Use defer to cleanup allocated service ip in case of error
parents e2093798 e551e0cb
...@@ -97,6 +97,15 @@ func (rs *REST) Create(ctx api.Context, obj runtime.Object) (runtime.Object, err ...@@ -97,6 +97,15 @@ func (rs *REST) Create(ctx api.Context, obj runtime.Object) (runtime.Object, err
return nil, err return nil, err
} }
releaseServiceIP := false
defer func() {
if releaseServiceIP {
if api.IsServiceIPSet(service) {
rs.portalMgr.Release(net.ParseIP(service.Spec.PortalIP))
}
}
}()
if api.IsServiceIPRequested(service) { if api.IsServiceIPRequested(service) {
// Allocate next available. // Allocate next available.
ip, err := rs.portalMgr.AllocateNext() ip, err := rs.portalMgr.AllocateNext()
...@@ -104,12 +113,14 @@ func (rs *REST) Create(ctx api.Context, obj runtime.Object) (runtime.Object, err ...@@ -104,12 +113,14 @@ func (rs *REST) Create(ctx api.Context, obj runtime.Object) (runtime.Object, err
return nil, err return nil, err
} }
service.Spec.PortalIP = ip.String() service.Spec.PortalIP = ip.String()
releaseServiceIP = true
} else if api.IsServiceIPSet(service) { } else if api.IsServiceIPSet(service) {
// Try to respect the requested IP. // Try to respect the requested IP.
if err := rs.portalMgr.Allocate(net.ParseIP(service.Spec.PortalIP)); err != nil { if err := rs.portalMgr.Allocate(net.ParseIP(service.Spec.PortalIP)); err != nil {
el := fielderrors.ValidationErrorList{fielderrors.NewFieldInvalid("spec.portalIP", service.Spec.PortalIP, err.Error())} el := fielderrors.ValidationErrorList{fielderrors.NewFieldInvalid("spec.portalIP", service.Spec.PortalIP, err.Error())}
return nil, errors.NewInvalid("Service", service.Name, el) return nil, errors.NewInvalid("Service", service.Name, el)
} }
releaseServiceIP = true
} }
// TODO: Move this to post-creation rectification loop, so that we make/remove external load balancers // TODO: Move this to post-creation rectification loop, so that we make/remove external load balancers
...@@ -117,20 +128,19 @@ func (rs *REST) Create(ctx api.Context, obj runtime.Object) (runtime.Object, err ...@@ -117,20 +128,19 @@ func (rs *REST) Create(ctx api.Context, obj runtime.Object) (runtime.Object, err
if service.Spec.CreateExternalLoadBalancer { if service.Spec.CreateExternalLoadBalancer {
err := rs.createExternalLoadBalancer(ctx, service) err := rs.createExternalLoadBalancer(ctx, service)
if err != nil { if err != nil {
if api.IsServiceIPSet(service) {
rs.portalMgr.Release(net.ParseIP(service.Spec.PortalIP))
}
return nil, err return nil, err
} }
} }
out, err := rs.registry.CreateService(ctx, service) out, err := rs.registry.CreateService(ctx, service)
if err != nil { if err != nil {
if api.IsServiceIPSet(service) {
rs.portalMgr.Release(net.ParseIP(service.Spec.PortalIP))
}
err = rest.CheckGeneratedNameError(rest.Services, err, service) err = rest.CheckGeneratedNameError(rest.Services, err, service)
} }
if err == nil {
releaseServiceIP = false
}
return out, err return out, err
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment