Merge pull request #746 from smarterclayton/atomic_create

Make create atomic for etcd on Services/ReplControllers
This commit is contained in:
Daniel Smith
2014-08-05 11:08:55 -07:00
5 changed files with 99 additions and 31 deletions

View File

@@ -17,6 +17,7 @@ limitations under the License.
package tools
import (
"errors"
"fmt"
"reflect"
"sync"
@@ -87,6 +88,11 @@ func IsEtcdNotFound(err error) bool {
return isEtcdErrorNum(err, EtcdErrorCodeNotFound)
}
// Returns true iff err is an etcd key node exists error.
func IsEtcdNodeExist(err error) bool {
return isEtcdErrorNum(err, EtcdErrorCodeNodeExist)
}
// IsEtcdTestFailed returns true iff err is an etcd write conflict.
func IsEtcdTestFailed(err error) bool {
return isEtcdErrorNum(err, EtcdErrorCodeTestFailed)
@@ -172,6 +178,21 @@ func (h *EtcdHelper) bodyAndExtractObj(key string, objPtr interface{}, ignoreNot
return body, response.Node.ModifiedIndex, err
}
func (h *EtcdHelper) CreateObj(key string, obj interface{}) error {
data, err := h.Encoding.Encode(obj)
if err != nil {
return err
}
if h.Versioning != nil {
if version, err := h.Versioning.ResourceVersion(obj); err == nil && version != 0 {
return errors.New("resourceVersion may not be set on objects to be created")
}
}
_, err = h.Client.Create(key, string(data), 0)
return err
}
// SetObj marshals obj via json, and stores under key. Will do an
// atomic update if obj's ResourceVersion field is set.
func (h *EtcdHelper) SetObj(key string, obj interface{}) error {