diff --git a/pkg/apiserver/apiserver.go b/pkg/apiserver/apiserver.go index 763a33de8b6..1ffefb25ce0 100644 --- a/pkg/apiserver/apiserver.go +++ b/pkg/apiserver/apiserver.go @@ -18,6 +18,7 @@ package apiserver import ( "bytes" + "encoding/json" "fmt" "io/ioutil" "net" @@ -36,8 +37,6 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/healthz" "github.com/GoogleCloudPlatform/kubernetes/pkg/httplog" "github.com/GoogleCloudPlatform/kubernetes/pkg/labels" - "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" - "github.com/GoogleCloudPlatform/kubernetes/pkg/util" "github.com/GoogleCloudPlatform/kubernetes/pkg/version" "github.com/GoogleCloudPlatform/kubernetes/pkg/watch" "github.com/golang/glog" @@ -88,40 +87,6 @@ type ResourceWatcher interface { WatchSingle(id string) (watch.Interface, error) } -// WorkFunc is used to perform any time consuming work for an api call, after -// the input has been validated. Pass one of these to MakeAsync to create an -// appropriate return value for the Update, Delete, and Create methods. -type WorkFunc func() (result interface{}, err error) - -// MakeAsync takes a function and executes it, delivering the result in the way required -// by RESTStorage's Update, Delete, and Create methods. -func MakeAsync(fn WorkFunc) <-chan interface{} { - channel := make(chan interface{}) - go func() { - defer util.HandleCrash() - obj, err := fn() - if err != nil { - status := http.StatusInternalServerError - switch { - case tools.IsEtcdConflict(err): - status = http.StatusConflict - } - channel <- &api.Status{ - Status: api.StatusFailure, - Details: err.Error(), - Code: status, - } - } else { - channel <- obj - } - // 'close' is used to signal that no further values will - // be written to the channel. Not strictly necessary, but - // also won't hurt. - close(channel) - }() - return channel -} - // APIServer is an HTTPHandler that delegates to RESTStorage objects. // It handles URLs of the form: // ${prefix}/${storage_key}[/${object_name}] diff --git a/pkg/apiserver/async.go b/pkg/apiserver/async.go new file mode 100644 index 00000000000..70b190354b0 --- /dev/null +++ b/pkg/apiserver/async.go @@ -0,0 +1,59 @@ +/* +Copyright 2014 Google Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package apiserver + +import ( + "net/http" + + "github.com/GoogleCloudPlatform/kubernetes/pkg/api" + "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" + "github.com/GoogleCloudPlatform/kubernetes/pkg/util" +) + +// WorkFunc is used to perform any time consuming work for an api call, after +// the input has been validated. Pass one of these to MakeAsync to create an +// appropriate return value for the Update, Delete, and Create methods. +type WorkFunc func() (result interface{}, err error) + +// MakeAsync takes a function and executes it, delivering the result in the way required +// by RESTStorage's Update, Delete, and Create methods. +func MakeAsync(fn WorkFunc) <-chan interface{} { + channel := make(chan interface{}) + go func() { + defer util.HandleCrash() + obj, err := fn() + if err != nil { + status := http.StatusInternalServerError + switch { + case tools.IsEtcdConflict(err): + status = http.StatusConflict + } + channel <- &api.Status{ + Status: api.StatusFailure, + Details: err.Error(), + Code: status, + } + } else { + channel <- obj + } + // 'close' is used to signal that no further values will + // be written to the channel. Not strictly necessary, but + // also won't hurt. + close(channel) + }() + return channel +}