2015-08-29 05:19:32 +00:00
|
|
|
/*
|
|
|
|
Copyright 2015 The Kubernetes Authors 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 etcd
|
|
|
|
|
|
|
|
import (
|
2016-01-15 02:04:05 +00:00
|
|
|
"reflect"
|
2015-08-29 05:19:32 +00:00
|
|
|
"testing"
|
|
|
|
|
|
|
|
"k8s.io/kubernetes/pkg/api"
|
2016-01-15 02:04:05 +00:00
|
|
|
"k8s.io/kubernetes/pkg/api/errors"
|
2016-03-16 01:23:47 +00:00
|
|
|
storeerr "k8s.io/kubernetes/pkg/api/errors/storage"
|
2016-02-06 02:43:02 +00:00
|
|
|
"k8s.io/kubernetes/pkg/api/unversioned"
|
2015-10-09 22:04:41 +00:00
|
|
|
"k8s.io/kubernetes/pkg/apis/extensions"
|
2015-08-29 05:19:32 +00:00
|
|
|
"k8s.io/kubernetes/pkg/fields"
|
|
|
|
"k8s.io/kubernetes/pkg/labels"
|
2015-11-05 15:04:42 +00:00
|
|
|
"k8s.io/kubernetes/pkg/registry/generic"
|
2015-08-29 05:19:32 +00:00
|
|
|
"k8s.io/kubernetes/pkg/registry/registrytest"
|
|
|
|
"k8s.io/kubernetes/pkg/runtime"
|
2015-11-10 11:23:51 +00:00
|
|
|
"k8s.io/kubernetes/pkg/storage/etcd/etcdtest"
|
2015-11-03 19:43:27 +00:00
|
|
|
etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
|
2016-03-11 02:43:55 +00:00
|
|
|
"k8s.io/kubernetes/pkg/util/diff"
|
2015-08-29 05:19:32 +00:00
|
|
|
)
|
|
|
|
|
2016-02-25 08:27:40 +00:00
|
|
|
const defaultReplicas = 100
|
|
|
|
|
2015-11-03 19:43:27 +00:00
|
|
|
func newStorage(t *testing.T) (*DeploymentStorage, *etcdtesting.EtcdTestServer) {
|
2015-12-08 14:21:04 +00:00
|
|
|
etcdStorage, server := registrytest.NewEtcdStorage(t, extensions.GroupName)
|
2016-03-23 23:45:24 +00:00
|
|
|
restOptions := generic.RESTOptions{Storage: etcdStorage, Decorator: generic.UndecoratedStorage, DeleteCollectionWorkers: 1}
|
2016-02-22 09:15:22 +00:00
|
|
|
deploymentStorage := NewStorage(restOptions)
|
2015-11-03 19:43:27 +00:00
|
|
|
return &deploymentStorage, server
|
2015-08-29 05:19:32 +00:00
|
|
|
}
|
|
|
|
|
2015-09-18 11:54:50 +00:00
|
|
|
var namespace = "foo-namespace"
|
|
|
|
var name = "foo-deployment"
|
|
|
|
|
2015-10-09 22:49:10 +00:00
|
|
|
func validNewDeployment() *extensions.Deployment {
|
|
|
|
return &extensions.Deployment{
|
2015-08-29 05:19:32 +00:00
|
|
|
ObjectMeta: api.ObjectMeta{
|
2015-09-18 11:54:50 +00:00
|
|
|
Name: name,
|
|
|
|
Namespace: namespace,
|
2015-08-29 05:19:32 +00:00
|
|
|
},
|
2015-10-09 22:49:10 +00:00
|
|
|
Spec: extensions.DeploymentSpec{
|
2016-02-06 02:43:02 +00:00
|
|
|
Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{"a": "b"}},
|
2015-10-26 23:20:43 +00:00
|
|
|
Template: api.PodTemplateSpec{
|
2015-08-29 05:19:32 +00:00
|
|
|
ObjectMeta: api.ObjectMeta{
|
|
|
|
Labels: map[string]string{"a": "b"},
|
|
|
|
},
|
|
|
|
Spec: api.PodSpec{
|
|
|
|
Containers: []api.Container{
|
|
|
|
{
|
|
|
|
Name: "test",
|
|
|
|
Image: "test_image",
|
|
|
|
ImagePullPolicy: api.PullIfNotPresent,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
RestartPolicy: api.RestartPolicyAlways,
|
|
|
|
DNSPolicy: api.DNSClusterFirst,
|
|
|
|
},
|
|
|
|
},
|
2016-02-05 22:45:05 +00:00
|
|
|
Replicas: 7,
|
2015-09-18 11:54:50 +00:00
|
|
|
},
|
2015-10-09 22:49:10 +00:00
|
|
|
Status: extensions.DeploymentStatus{
|
2015-09-18 11:54:50 +00:00
|
|
|
Replicas: 5,
|
2015-08-29 05:19:32 +00:00
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var validDeployment = *validNewDeployment()
|
|
|
|
|
|
|
|
func TestCreate(t *testing.T) {
|
2015-11-03 19:43:27 +00:00
|
|
|
storage, server := newStorage(t)
|
|
|
|
defer server.Terminate(t)
|
|
|
|
test := registrytest.New(t, storage.Deployment.Etcd)
|
2015-08-29 05:19:32 +00:00
|
|
|
deployment := validNewDeployment()
|
|
|
|
deployment.ObjectMeta = api.ObjectMeta{}
|
|
|
|
test.TestCreate(
|
|
|
|
// valid
|
|
|
|
deployment,
|
|
|
|
// invalid (invalid selector)
|
2015-10-09 22:49:10 +00:00
|
|
|
&extensions.Deployment{
|
|
|
|
Spec: extensions.DeploymentSpec{
|
2016-02-06 02:43:02 +00:00
|
|
|
Selector: &unversioned.LabelSelector{MatchLabels: map[string]string{}},
|
2015-08-29 05:19:32 +00:00
|
|
|
Template: validDeployment.Spec.Template,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestUpdate(t *testing.T) {
|
2015-11-03 19:43:27 +00:00
|
|
|
storage, server := newStorage(t)
|
|
|
|
defer server.Terminate(t)
|
|
|
|
test := registrytest.New(t, storage.Deployment.Etcd)
|
2015-08-29 05:19:32 +00:00
|
|
|
test.TestUpdate(
|
|
|
|
// valid
|
|
|
|
validNewDeployment(),
|
|
|
|
// updateFunc
|
|
|
|
func(obj runtime.Object) runtime.Object {
|
2015-10-09 22:49:10 +00:00
|
|
|
object := obj.(*extensions.Deployment)
|
2015-08-29 05:19:32 +00:00
|
|
|
object.Spec.Template.Spec.NodeSelector = map[string]string{"c": "d"}
|
|
|
|
return object
|
|
|
|
},
|
|
|
|
// invalid updateFunc
|
|
|
|
func(obj runtime.Object) runtime.Object {
|
2015-10-09 22:49:10 +00:00
|
|
|
object := obj.(*extensions.Deployment)
|
2015-08-29 05:19:32 +00:00
|
|
|
object.Name = ""
|
|
|
|
return object
|
|
|
|
},
|
|
|
|
func(obj runtime.Object) runtime.Object {
|
2015-10-09 22:49:10 +00:00
|
|
|
object := obj.(*extensions.Deployment)
|
2015-08-29 05:19:32 +00:00
|
|
|
object.Spec.Template.Spec.RestartPolicy = api.RestartPolicyOnFailure
|
|
|
|
return object
|
|
|
|
},
|
|
|
|
func(obj runtime.Object) runtime.Object {
|
2015-10-09 22:49:10 +00:00
|
|
|
object := obj.(*extensions.Deployment)
|
2016-02-06 02:43:02 +00:00
|
|
|
object.Spec.Selector = &unversioned.LabelSelector{MatchLabels: map[string]string{}}
|
2015-08-29 05:19:32 +00:00
|
|
|
return object
|
|
|
|
},
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
2015-09-01 13:27:13 +00:00
|
|
|
func TestDelete(t *testing.T) {
|
2015-11-03 19:43:27 +00:00
|
|
|
storage, server := newStorage(t)
|
|
|
|
defer server.Terminate(t)
|
|
|
|
test := registrytest.New(t, storage.Deployment.Etcd)
|
2015-09-01 13:27:13 +00:00
|
|
|
test.TestDelete(validNewDeployment())
|
|
|
|
}
|
|
|
|
|
2015-08-31 12:11:11 +00:00
|
|
|
func TestGet(t *testing.T) {
|
2015-11-03 19:43:27 +00:00
|
|
|
storage, server := newStorage(t)
|
|
|
|
defer server.Terminate(t)
|
|
|
|
test := registrytest.New(t, storage.Deployment.Etcd)
|
2015-08-29 05:19:32 +00:00
|
|
|
test.TestGet(validNewDeployment())
|
|
|
|
}
|
|
|
|
|
2015-08-31 12:11:11 +00:00
|
|
|
func TestList(t *testing.T) {
|
2015-11-03 19:43:27 +00:00
|
|
|
storage, server := newStorage(t)
|
|
|
|
defer server.Terminate(t)
|
|
|
|
test := registrytest.New(t, storage.Deployment.Etcd)
|
2015-08-31 12:11:11 +00:00
|
|
|
test.TestList(validNewDeployment())
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestWatch(t *testing.T) {
|
2015-11-03 19:43:27 +00:00
|
|
|
storage, server := newStorage(t)
|
|
|
|
defer server.Terminate(t)
|
|
|
|
test := registrytest.New(t, storage.Deployment.Etcd)
|
2015-08-31 12:11:11 +00:00
|
|
|
test.TestWatch(
|
2015-08-29 05:19:32 +00:00
|
|
|
validNewDeployment(),
|
2015-08-31 12:11:11 +00:00
|
|
|
// matching labels
|
|
|
|
[]labels.Set{},
|
|
|
|
// not matching labels
|
|
|
|
[]labels.Set{
|
|
|
|
{"a": "c"},
|
|
|
|
{"foo": "bar"},
|
|
|
|
},
|
|
|
|
// matching fields
|
|
|
|
[]fields.Set{
|
2015-09-18 11:54:50 +00:00
|
|
|
{"metadata.name": name},
|
2015-08-31 12:11:11 +00:00
|
|
|
},
|
|
|
|
// not matchin fields
|
|
|
|
[]fields.Set{
|
|
|
|
{"metadata.name": "bar"},
|
2015-09-18 11:54:50 +00:00
|
|
|
{"name": name},
|
2015-08-29 05:19:32 +00:00
|
|
|
},
|
2015-08-31 12:11:11 +00:00
|
|
|
)
|
2015-08-29 05:19:32 +00:00
|
|
|
}
|
2015-09-18 11:54:50 +00:00
|
|
|
|
2016-02-25 08:27:40 +00:00
|
|
|
func TestScaleGet(t *testing.T) {
|
|
|
|
storage, server := newStorage(t)
|
|
|
|
defer server.Terminate(t)
|
2016-02-06 02:43:02 +00:00
|
|
|
|
2016-02-25 08:27:40 +00:00
|
|
|
var deployment extensions.Deployment
|
|
|
|
ctx := api.WithNamespace(api.NewContext(), namespace)
|
|
|
|
key := etcdtest.AddPrefix("/deployments/" + namespace + "/" + name)
|
2016-03-25 13:24:58 +00:00
|
|
|
if err := storage.Deployment.Storage.Create(ctx, key, &validDeployment, &deployment, 0); err != nil {
|
2016-02-25 08:27:40 +00:00
|
|
|
t.Fatalf("error setting new deployment (key: %s) %v: %v", key, validDeployment, err)
|
|
|
|
}
|
2016-02-06 02:43:02 +00:00
|
|
|
|
2016-03-09 00:27:13 +00:00
|
|
|
want := &extensions.Scale{
|
2016-02-25 08:27:40 +00:00
|
|
|
ObjectMeta: api.ObjectMeta{
|
|
|
|
Name: name,
|
|
|
|
Namespace: namespace,
|
|
|
|
UID: deployment.UID,
|
|
|
|
ResourceVersion: deployment.ResourceVersion,
|
|
|
|
CreationTimestamp: deployment.CreationTimestamp,
|
|
|
|
},
|
2016-03-09 00:27:13 +00:00
|
|
|
Spec: extensions.ScaleSpec{
|
2016-02-25 08:27:40 +00:00
|
|
|
Replicas: validDeployment.Spec.Replicas,
|
|
|
|
},
|
2016-03-09 00:27:13 +00:00
|
|
|
Status: extensions.ScaleStatus{
|
2016-02-25 08:27:40 +00:00
|
|
|
Replicas: validDeployment.Status.Replicas,
|
2016-03-09 00:27:13 +00:00
|
|
|
Selector: validDeployment.Spec.Selector,
|
2016-02-25 08:27:40 +00:00
|
|
|
},
|
|
|
|
}
|
|
|
|
obj, err := storage.Scale.Get(ctx, name)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("error fetching scale for %s: %v", name, err)
|
|
|
|
}
|
2016-03-09 00:27:13 +00:00
|
|
|
got := obj.(*extensions.Scale)
|
2016-02-25 08:27:40 +00:00
|
|
|
if !api.Semantic.DeepEqual(want, got) {
|
2016-03-11 02:43:55 +00:00
|
|
|
t.Errorf("unexpected scale: %s", diff.ObjectDiff(want, got))
|
2016-02-25 08:27:40 +00:00
|
|
|
}
|
|
|
|
}
|
2016-02-06 02:43:02 +00:00
|
|
|
|
2016-02-25 08:27:40 +00:00
|
|
|
func TestScaleUpdate(t *testing.T) {
|
|
|
|
storage, server := newStorage(t)
|
|
|
|
defer server.Terminate(t)
|
2016-02-06 02:43:02 +00:00
|
|
|
|
2016-02-25 08:27:40 +00:00
|
|
|
var deployment extensions.Deployment
|
|
|
|
ctx := api.WithNamespace(api.NewContext(), namespace)
|
|
|
|
key := etcdtest.AddPrefix("/deployments/" + namespace + "/" + name)
|
2016-03-25 13:24:58 +00:00
|
|
|
if err := storage.Deployment.Storage.Create(ctx, key, &validDeployment, &deployment, 0); err != nil {
|
2016-02-25 08:27:40 +00:00
|
|
|
t.Fatalf("error setting new deployment (key: %s) %v: %v", key, validDeployment, err)
|
|
|
|
}
|
|
|
|
replicas := 12
|
2016-03-09 00:27:13 +00:00
|
|
|
update := extensions.Scale{
|
2016-02-25 08:27:40 +00:00
|
|
|
ObjectMeta: api.ObjectMeta{Name: name, Namespace: namespace},
|
2016-03-09 00:27:13 +00:00
|
|
|
Spec: extensions.ScaleSpec{
|
2016-02-25 08:27:40 +00:00
|
|
|
Replicas: replicas,
|
|
|
|
},
|
|
|
|
}
|
2016-02-06 02:43:02 +00:00
|
|
|
|
2016-02-25 08:27:40 +00:00
|
|
|
if _, _, err := storage.Scale.Update(ctx, &update); err != nil {
|
|
|
|
t.Fatalf("error updating scale %v: %v", update, err)
|
|
|
|
}
|
|
|
|
obj, err := storage.Scale.Get(ctx, name)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("error fetching scale for %s: %v", name, err)
|
|
|
|
}
|
2016-03-09 00:27:13 +00:00
|
|
|
scale := obj.(*extensions.Scale)
|
2016-02-25 08:27:40 +00:00
|
|
|
if scale.Spec.Replicas != replicas {
|
|
|
|
t.Errorf("wrong replicas count expected: %d got: %d", replicas, deployment.Spec.Replicas)
|
|
|
|
}
|
2016-02-06 02:43:02 +00:00
|
|
|
|
2016-02-25 08:27:40 +00:00
|
|
|
update.ResourceVersion = deployment.ResourceVersion
|
|
|
|
update.Spec.Replicas = 15
|
2016-02-06 02:43:02 +00:00
|
|
|
|
2016-02-25 08:27:40 +00:00
|
|
|
if _, _, err = storage.Scale.Update(ctx, &update); err != nil && !errors.IsConflict(err) {
|
|
|
|
t.Fatalf("unexpected error, expecting an update conflict but got %v", err)
|
|
|
|
}
|
|
|
|
}
|
2015-10-17 01:01:08 +00:00
|
|
|
|
|
|
|
func TestStatusUpdate(t *testing.T) {
|
2015-11-03 19:43:27 +00:00
|
|
|
storage, server := newStorage(t)
|
|
|
|
defer server.Terminate(t)
|
2015-10-17 01:01:08 +00:00
|
|
|
|
|
|
|
ctx := api.WithNamespace(api.NewContext(), namespace)
|
|
|
|
key := etcdtest.AddPrefix("/deployments/" + namespace + "/" + name)
|
2016-03-25 13:24:58 +00:00
|
|
|
if err := storage.Deployment.Storage.Create(ctx, key, &validDeployment, nil, 0); err != nil {
|
2015-10-17 01:01:08 +00:00
|
|
|
t.Fatalf("unexpected error: %v", err)
|
|
|
|
}
|
|
|
|
update := extensions.Deployment{
|
|
|
|
ObjectMeta: validDeployment.ObjectMeta,
|
|
|
|
Spec: extensions.DeploymentSpec{
|
2016-02-25 08:27:40 +00:00
|
|
|
Replicas: defaultReplicas,
|
2015-10-17 01:01:08 +00:00
|
|
|
},
|
|
|
|
Status: extensions.DeploymentStatus{
|
2016-02-25 08:27:40 +00:00
|
|
|
Replicas: defaultReplicas,
|
2015-10-17 01:01:08 +00:00
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, _, err := storage.Status.Update(ctx, &update); err != nil {
|
|
|
|
t.Fatalf("unexpected error: %v", err)
|
|
|
|
}
|
2015-11-03 19:43:27 +00:00
|
|
|
obj, err := storage.Deployment.Get(ctx, name)
|
2015-10-17 01:01:08 +00:00
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("unexpected error: %v", err)
|
|
|
|
}
|
|
|
|
|
2015-11-03 19:43:27 +00:00
|
|
|
deployment := obj.(*extensions.Deployment)
|
2015-10-17 01:01:08 +00:00
|
|
|
if deployment.Spec.Replicas != 7 {
|
|
|
|
t.Errorf("we expected .spec.replicas to not be updated but it was updated to %v", deployment.Spec.Replicas)
|
|
|
|
}
|
2016-02-25 08:27:40 +00:00
|
|
|
if deployment.Status.Replicas != defaultReplicas {
|
|
|
|
t.Errorf("we expected .status.replicas to be updated to %d but it was %v", defaultReplicas, deployment.Status.Replicas)
|
2015-10-17 01:01:08 +00:00
|
|
|
}
|
|
|
|
}
|
2016-01-15 02:04:05 +00:00
|
|
|
|
|
|
|
func TestEtcdCreateDeploymentRollback(t *testing.T) {
|
|
|
|
ctx := api.WithNamespace(api.NewContext(), namespace)
|
|
|
|
|
|
|
|
testCases := map[string]struct {
|
|
|
|
rollback extensions.DeploymentRollback
|
|
|
|
errOK func(error) bool
|
|
|
|
}{
|
|
|
|
"normal": {
|
|
|
|
rollback: extensions.DeploymentRollback{
|
|
|
|
Name: name,
|
|
|
|
UpdatedAnnotations: map[string]string{},
|
|
|
|
RollbackTo: extensions.RollbackConfig{Revision: 1},
|
|
|
|
},
|
|
|
|
errOK: func(err error) bool { return err == nil },
|
|
|
|
},
|
|
|
|
"noAnnotation": {
|
|
|
|
rollback: extensions.DeploymentRollback{
|
|
|
|
Name: name,
|
|
|
|
RollbackTo: extensions.RollbackConfig{Revision: 1},
|
|
|
|
},
|
|
|
|
errOK: func(err error) bool { return err == nil },
|
|
|
|
},
|
|
|
|
"noName": {
|
|
|
|
rollback: extensions.DeploymentRollback{
|
|
|
|
UpdatedAnnotations: map[string]string{},
|
|
|
|
RollbackTo: extensions.RollbackConfig{Revision: 1},
|
|
|
|
},
|
|
|
|
errOK: func(err error) bool { return err != nil },
|
|
|
|
},
|
|
|
|
}
|
|
|
|
for k, test := range testCases {
|
|
|
|
storage, server := newStorage(t)
|
|
|
|
rollbackStorage := storage.Rollback
|
|
|
|
key, _ := storage.Deployment.KeyFunc(ctx, name)
|
|
|
|
key = etcdtest.AddPrefix(key)
|
|
|
|
|
|
|
|
if _, err := storage.Deployment.Create(ctx, validNewDeployment()); err != nil {
|
|
|
|
t.Fatalf("%s: unexpected error: %v", k, err)
|
|
|
|
}
|
|
|
|
if _, err := rollbackStorage.Create(ctx, &test.rollback); !test.errOK(err) {
|
|
|
|
t.Errorf("%s: unexpected error: %v", k, err)
|
|
|
|
} else if err == nil {
|
|
|
|
// If rollback succeeded, verify Rollback field of deployment
|
|
|
|
d, err := storage.Deployment.Get(ctx, validNewDeployment().ObjectMeta.Name)
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("%s: unexpected error: %v", k, err)
|
|
|
|
} else if !reflect.DeepEqual(*d.(*extensions.Deployment).Spec.RollbackTo, test.rollback.RollbackTo) {
|
|
|
|
t.Errorf("%s: expected: %v, got: %v", k, *d.(*extensions.Deployment).Spec.RollbackTo, test.rollback.RollbackTo)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
server.Terminate(t)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Ensure that when a deploymentRollback is created for a deployment that has already been deleted
|
|
|
|
// by the API server, API server returns not-found error.
|
|
|
|
func TestEtcdCreateDeploymentRollbackNoDeployment(t *testing.T) {
|
|
|
|
storage, server := newStorage(t)
|
|
|
|
defer server.Terminate(t)
|
|
|
|
rollbackStorage := storage.Rollback
|
|
|
|
ctx := api.WithNamespace(api.NewContext(), namespace)
|
|
|
|
|
|
|
|
key, _ := storage.Deployment.KeyFunc(ctx, name)
|
|
|
|
key = etcdtest.AddPrefix(key)
|
|
|
|
_, err := rollbackStorage.Create(ctx, &extensions.DeploymentRollback{
|
|
|
|
Name: name,
|
|
|
|
UpdatedAnnotations: map[string]string{},
|
|
|
|
RollbackTo: extensions.RollbackConfig{Revision: 1},
|
|
|
|
})
|
|
|
|
if err == nil {
|
|
|
|
t.Fatalf("Expected not-found-error but got nothing")
|
|
|
|
}
|
2016-03-16 01:23:47 +00:00
|
|
|
if !errors.IsNotFound(storeerr.InterpretGetError(err, extensions.Resource("deployments"), name)) {
|
2016-01-15 02:04:05 +00:00
|
|
|
t.Fatalf("Unexpected error returned: %#v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
_, err = storage.Deployment.Get(ctx, name)
|
|
|
|
if err == nil {
|
|
|
|
t.Fatalf("Expected not-found-error but got nothing")
|
|
|
|
}
|
2016-03-16 01:23:47 +00:00
|
|
|
if !errors.IsNotFound(storeerr.InterpretGetError(err, extensions.Resource("deployments"), name)) {
|
2016-01-15 02:04:05 +00:00
|
|
|
t.Fatalf("Unexpected error: %v", err)
|
|
|
|
}
|
|
|
|
}
|