// Delete removes a tag from a stream. `id` is of the format <stream name>:<tag>. // The associated image that the tag points to is *not* deleted. // The tag history remains intact and is not deleted. func (r *REST) Delete(ctx kapi.Context, id string) (runtime.Object, error) { name, tag, err := nameAndTag(id) if err != nil { return nil, err } stream, err := r.imageStreamRegistry.GetImageStream(ctx, name) if err != nil { return nil, err } if stream.Spec.Tags == nil { return nil, errors.NewNotFound("imageStreamTag", tag) } _, ok := stream.Spec.Tags[tag] if !ok { return nil, errors.NewNotFound("imageStreamTag", tag) } delete(stream.Spec.Tags, tag) _, err = r.imageStreamRegistry.UpdateImageStream(ctx, stream) if err != nil { return nil, fmt.Errorf("Error removing tag from image stream: %s", err) } return &kapi.Status{Status: kapi.StatusSuccess}, nil }
func TestImageStreamImportUnsupported(t *testing.T) { testCases := []struct { status unversioned.Status errFn func(err error) bool }{ { status: errors.NewNotFound("", "").(kclient.APIStatus).Status(), errFn: func(err error) bool { return err == ErrImageStreamImportUnsupported }, }, { status: errors.NewNotFound("Other", "").(kclient.APIStatus).Status(), errFn: func(err error) bool { return err != ErrImageStreamImportUnsupported && errors.IsNotFound(err) }, }, { status: errors.NewConflict("Other", "", nil).(kclient.APIStatus).Status(), errFn: func(err error) bool { return err != ErrImageStreamImportUnsupported && errors.IsConflict(err) }, }, } for i, test := range testCases { c, err := New(&kclient.Config{ Transport: roundTripFunc(func(req *http.Request) (*http.Response, error) { buf := bytes.NewBuffer([]byte(runtime.EncodeOrDie(latest.GroupOrDie("").Codec, &test.status))) return &http.Response{StatusCode: http.StatusNotFound, Body: ioutil.NopCloser(buf)}, nil }), }) if err != nil { t.Fatal(err) } if _, err := c.ImageStreams("test").Import(&api.ImageStreamImport{}); !test.errFn(err) { t.Errorf("%d: error: %v", i, err) } } }
func (o objects) Kind(kind unversioned.GroupVersionKind, name string) (runtime.Object, error) { // TODO our test clients deal in internal versions. We need to plumb that knowledge down here // we might do this via an extra function to the scheme to allow getting internal group versions // I'm punting for now kind.Version = "" empty, _ := o.scheme.New(kind) nilValue := reflect.Zero(reflect.TypeOf(empty)).Interface().(runtime.Object) arr, ok := o.types[kind.Kind] if !ok { if strings.HasSuffix(kind.Kind, "List") { itemKind := kind.Kind[:len(kind.Kind)-4] arr, ok := o.types[itemKind] if !ok { return empty, nil } out, err := o.scheme.New(kind) if err != nil { return nilValue, err } if err := meta.SetList(out, arr); err != nil { return nilValue, err } if out, err = o.scheme.Copy(out); err != nil { return nilValue, err } return out, nil } return nilValue, errors.NewNotFound(unversioned.GroupResource{Group: kind.Group, Resource: kind.Kind}, name) } index := o.last[kind.Kind] if index >= len(arr) { index = len(arr) - 1 } if index < 0 { return nilValue, errors.NewNotFound(unversioned.GroupResource{Group: kind.Group, Resource: kind.Kind}, name) } out, err := o.scheme.Copy(arr[index]) if err != nil { return nilValue, err } o.last[kind.Kind] = index + 1 if status, ok := out.(*unversioned.Status); ok { if status.Details != nil { status.Details.Kind = kind.Kind } if status.Status != unversioned.StatusSuccess { return nilValue, &errors.StatusError{ErrStatus: *status} } } return out, nil }
func (o objects) Kind(kind unversioned.GroupVersionKind, name string) (runtime.Object, error) { if len(kind.Version) == 0 { kind.Version = runtime.APIVersionInternal } empty, err := o.scheme.New(kind) nilValue := reflect.Zero(reflect.TypeOf(empty)).Interface().(runtime.Object) arr, ok := o.types[kind.Kind] if !ok { if strings.HasSuffix(kind.Kind, "List") { itemKind := kind.Kind[:len(kind.Kind)-4] arr, ok := o.types[itemKind] if !ok { return empty, nil } out, err := o.scheme.New(kind) if err != nil { return nilValue, err } if err := meta.SetList(out, arr); err != nil { return nilValue, err } if out, err = o.scheme.Copy(out); err != nil { return nilValue, err } return out, nil } return nilValue, errors.NewNotFound(unversioned.GroupResource{Group: kind.Group, Resource: kind.Kind}, name) } index := o.last[kind.Kind] if index >= len(arr) { index = len(arr) - 1 } if index < 0 { return nilValue, errors.NewNotFound(unversioned.GroupResource{Group: kind.Group, Resource: kind.Kind}, name) } out, err := o.scheme.Copy(arr[index]) if err != nil { return nilValue, err } o.last[kind.Kind] = index + 1 if status, ok := out.(*unversioned.Status); ok { if status.Details != nil { status.Details.Kind = kind.Kind } if status.Status != unversioned.StatusSuccess { return nilValue, &errors.StatusError{ErrStatus: *status} } } return out, nil }
func (m *VirtualStorage) updateRole(ctx kapi.Context, name string, objInfo rest.UpdatedObjectInfo, allowEscalation bool) (*authorizationapi.Role, bool, error) { old, err := m.Get(ctx, name) if err != nil { return nil, false, err } obj, err := objInfo.UpdatedObject(ctx, old) if err != nil { return nil, false, err } role, ok := obj.(*authorizationapi.Role) if !ok { return nil, false, kapierrors.NewBadRequest(fmt.Sprintf("obj is not a role: %#v", obj)) } if err := rest.BeforeUpdate(m.UpdateStrategy, ctx, obj, old); err != nil { return nil, false, err } if !allowEscalation { if err := rulevalidation.ConfirmNoEscalation(ctx, authorizationapi.Resource("role"), role.Name, m.RuleResolver, authorizationinterfaces.NewLocalRoleAdapter(role)); err != nil { return nil, false, err } } policy, err := m.PolicyStorage.GetPolicy(ctx, authorizationapi.PolicyName) if err != nil && kapierrors.IsNotFound(err) { return nil, false, kapierrors.NewNotFound(authorizationapi.Resource("role"), role.Name) } if err != nil { return nil, false, err } oldRole, exists := policy.Roles[role.Name] if !exists { return nil, false, kapierrors.NewNotFound(authorizationapi.Resource("role"), role.Name) } // non-mutating change if kapi.Semantic.DeepEqual(oldRole, role) { return role, false, nil } role.ResourceVersion = policy.ResourceVersion policy.Roles[role.Name] = role policy.LastModified = unversioned.Now() if err := m.PolicyStorage.UpdatePolicy(ctx, policy); err != nil { return nil, false, err } return role, false, nil }
func (o objects) Kind(kind, name string) (runtime.Object, error) { empty, _ := o.scheme.New("", kind) nilValue := reflect.Zero(reflect.TypeOf(empty)).Interface().(runtime.Object) arr, ok := o.types[kind] if !ok { if strings.HasSuffix(kind, "List") { itemKind := kind[:len(kind)-4] arr, ok := o.types[itemKind] if !ok { return empty, nil } out, err := o.scheme.New("", kind) if err != nil { return nilValue, err } if err := runtime.SetList(out, arr); err != nil { return nilValue, err } if out, err = o.scheme.Copy(out); err != nil { return nilValue, err } return out, nil } return nilValue, errors.NewNotFound(kind, name) } index := o.last[kind] if index >= len(arr) { index = len(arr) - 1 } if index < 0 { return nilValue, errors.NewNotFound(kind, name) } out, err := o.scheme.Copy(arr[index]) if err != nil { return nilValue, err } o.last[kind] = index + 1 if status, ok := out.(*api.Status); ok { if status.Details != nil { status.Details.Kind = kind } if status.Status != api.StatusSuccess { return nilValue, &errors.StatusError{*status} } } return out, nil }
// Get returns a streamer resource with the contents of the build log func (r *REST) Get(ctx kapi.Context, name string, opts runtime.Object) (runtime.Object, error) { buildLogOpts, ok := opts.(*api.BuildLogOptions) if !ok { return nil, errors.NewBadRequest("did not get an expected options.") } build, err := r.BuildRegistry.GetBuild(ctx, name) if err != nil { return nil, errors.NewNotFound("build", name) } switch build.Status.Phase { // Build has not launched, wait til it runs case api.BuildPhaseNew, api.BuildPhasePending: if buildLogOpts.NoWait { glog.V(4).Infof("Build %s/%s is in %s state. No logs to retrieve yet.", build.Namespace, name, build.Status.Phase) // return empty content if not waiting for build return &genericrest.LocationStreamer{}, nil } glog.V(4).Infof("Build %s/%s is in %s state, waiting for Build to start", build.Namespace, name, build.Status.Phase) err := r.waitForBuild(ctx, build) if err != nil { return nil, err } // The build was cancelled case api.BuildPhaseCancelled: return nil, errors.NewBadRequest(fmt.Sprintf("build %s/%s was cancelled. %s", build.Namespace, build.Name, buildutil.NoBuildLogsMessage)) // An error occurred launching the build, return an error case api.BuildPhaseError: return nil, errors.NewBadRequest(fmt.Sprintf("build %s/%s is in an error state. %s", build.Namespace, build.Name, buildutil.NoBuildLogsMessage)) } // The container should be the default build container, so setting it to blank buildPodName := buildutil.GetBuildPodName(build) logOpts := &kapi.PodLogOptions{ Follow: buildLogOpts.Follow, } location, transport, err := pod.LogLocation(r.PodGetter, r.ConnectionInfo, ctx, buildPodName, logOpts) if err != nil { if errors.IsNotFound(err) { return nil, errors.NewNotFound("pod", buildPodName) } return nil, errors.NewBadRequest(err.Error()) } return &genericrest.LocationStreamer{ Location: location, Transport: transport, ContentType: "text/plain", Flush: buildLogOpts.Follow, }, nil }
func (m *VirtualStorage) Get(ctx kapi.Context, name string) (runtime.Object, error) { policyBinding, err := m.getPolicyBindingOwningRoleBinding(ctx, name) if err != nil && kapierrors.IsNotFound(err) { return nil, kapierrors.NewNotFound("RoleBinding", name) } if err != nil { return nil, err } binding, exists := policyBinding.RoleBindings[name] if !exists { return nil, kapierrors.NewNotFound("RoleBinding", name) } return binding, nil }
func (c *mockBinderClient) GetPersistentVolumeClaim(namespace, name string) (*api.PersistentVolumeClaim, error) { if c.claim != nil { return c.claim, nil } else { return nil, errors.NewNotFound("persistentVolume", name) } }
func (r *ScaleREST) Update(ctx api.Context, name string, objInfo rest.UpdatedObjectInfo) (runtime.Object, bool, error) { rc, err := r.registry.GetController(ctx, name) if err != nil { return nil, false, errors.NewNotFound(autoscaling.Resource("replicationcontrollers/scale"), name) } oldScale := scaleFromRC(rc) obj, err := objInfo.UpdatedObject(ctx, oldScale) if err != nil { return nil, false, err } if obj == nil { return nil, false, errors.NewBadRequest("nil update passed to Scale") } scale, ok := obj.(*autoscaling.Scale) if !ok { return nil, false, errors.NewBadRequest(fmt.Sprintf("wrong object passed to Scale update: %v", obj)) } if errs := validation.ValidateScale(scale); len(errs) > 0 { return nil, false, errors.NewInvalid(autoscaling.Kind("Scale"), scale.Name, errs) } rc.Spec.Replicas = scale.Spec.Replicas rc.ResourceVersion = scale.ResourceVersion rc, err = r.registry.UpdateController(ctx, rc) if err != nil { return nil, false, err } return scaleFromRC(rc), false, nil }
func (r *ScaleREST) Update(ctx api.Context, obj runtime.Object) (runtime.Object, bool, error) { if obj == nil { return nil, false, errors.NewBadRequest(fmt.Sprintf("nil update passed to Scale")) } scale, ok := obj.(*extensions.Scale) if !ok { return nil, false, errors.NewBadRequest(fmt.Sprintf("wrong object passed to Scale update: %v", obj)) } if errs := extvalidation.ValidateScale(scale); len(errs) > 0 { return nil, false, errors.NewInvalid(extensions.Kind("Scale"), scale.Name, errs) } rs, err := r.registry.GetReplicaSet(ctx, scale.Name) if err != nil { return nil, false, errors.NewNotFound(extensions.Resource("replicasets/scale"), scale.Name) } rs.Spec.Replicas = scale.Spec.Replicas rs.ResourceVersion = scale.ResourceVersion rs, err = r.registry.UpdateReplicaSet(ctx, rs) if err != nil { return nil, false, err } newScale, err := scaleFromReplicaSet(rs) if err != nil { return nil, false, errors.NewBadRequest(fmt.Sprintf("%v", err)) } return newScale, false, err }
func (m *VirtualStorage) getReferencedRole(roleRef kapi.ObjectReference) (*authorizationapi.Role, error) { ctx := kapi.WithNamespace(kapi.NewContext(), roleRef.Namespace) var policy *authorizationapi.Policy var err error switch { case len(roleRef.Namespace) == 0: var clusterPolicy *authorizationapi.ClusterPolicy clusterPolicy, err = m.ClusterPolicyRegistry.GetClusterPolicy(ctx, authorizationapi.PolicyName) policy = authorizationapi.ToPolicy(clusterPolicy) default: policy, err = m.PolicyRegistry.GetPolicy(ctx, authorizationapi.PolicyName) } if err != nil { return nil, err } role, exists := policy.Roles[roleRef.Name] if !exists { return nil, kapierrors.NewNotFound("Role", roleRef.Name) } return role, nil }
func (r *ScaleREST) Get(ctx api.Context, name string) (runtime.Object, error) { rc, err := r.registry.GetController(ctx, name) if err != nil { return nil, errors.NewNotFound(autoscaling.Resource("replicationcontrollers/scale"), name) } return scaleFromRC(rc), nil }
// Getter interface func (m *MetricStorage) Get(ctx api.Context, name string) (runtime.Object, error) { nodeMetrics := m.getNodeMetrics(name) if nodeMetrics == nil { return &metrics.NodeMetrics{}, errors.NewNotFound(m.groupResource, name) } return nodeMetrics, nil }
func TestControllerError(t *testing.T) { testCases := map[string]struct { err func() error errFn func(err error) bool reactFn testclient.ReactionFunc actions int }{ "not found": { err: func() error { return errors.NewNotFound("namespace", "test") }, errFn: func(err error) bool { return err == nil }, actions: 1, }, "unknown": { err: func() error { return fmt.Errorf("unknown") }, errFn: func(err error) bool { return err.Error() == "unknown" }, actions: 1, }, "conflict": { actions: 4, reactFn: func(a testclient.Action) (runtime.Object, error) { if a.Matches("get", "namespaces") { return &kapi.Namespace{ObjectMeta: kapi.ObjectMeta{Name: "test"}}, nil } return (*kapi.Namespace)(nil), errors.NewConflict("namespace", "test", fmt.Errorf("test conflict")) }, errFn: func(err error) bool { return err != nil && strings.Contains(err.Error(), "unable to allocate security info") }, }, } for s, testCase := range testCases { client := &testclient.Fake{ReactFn: testCase.reactFn} if client.ReactFn == nil { client.ReactFn = func(a testclient.Action) (runtime.Object, error) { return (*kapi.Namespace)(nil), testCase.err() } } uidr, _ := uid.NewRange(10, 19, 2) mcsr, _ := mcs.NewRange("s0:", 10, 2) uida := uidallocator.NewInMemory(uidr) c := Allocation{ uid: uida, mcs: DefaultMCSAllocation(uidr, mcsr, 5), client: client.Namespaces(), } err := c.Next(&kapi.Namespace{ObjectMeta: kapi.ObjectMeta{Name: "test"}}) if !testCase.errFn(err) { t.Errorf("%s: unexpected error: %v", s, err) } if len(client.Actions()) != testCase.actions { t.Errorf("%s: expected %d actions: %v", s, testCase.actions, client.Actions()) } if uida.Free() != 5 { t.Errorf("%s: should not have allocated uid: %d/%d", s, uida.Free(), uidr.Size()) } } }
func (r *ScaleREST) Get(ctx api.Context, name string) (runtime.Object, error) { deployment, err := (*r.registry).GetDeployment(ctx, name) if err != nil { return nil, errors.NewNotFound(extensions.Resource("deployments/scale"), name) } return extensions.ScaleFromDeployment(deployment), nil }
// ResolveImageID returns latest TagEvent for specified imageID and an error if // there's more than one image matching the ID or when one does not exist. func ResolveImageID(stream *ImageStream, imageID string) (*TagEvent, error) { var event *TagEvent set := sets.NewString() for _, history := range stream.Status.Tags { for i := range history.Items { tagging := &history.Items[i] if d, err := digest.ParseDigest(tagging.Image); err == nil { if strings.HasPrefix(d.Hex(), imageID) || strings.HasPrefix(tagging.Image, imageID) { event = tagging set.Insert(tagging.Image) } continue } if strings.HasPrefix(tagging.Image, imageID) { event = tagging set.Insert(tagging.Image) } } } switch len(set) { case 1: return &TagEvent{ Created: unversioned.Now(), DockerImageReference: event.DockerImageReference, Image: event.Image, }, nil case 0: return nil, errors.NewNotFound(Resource("imagestreamimage"), imageID) default: return nil, errors.NewConflict(Resource("imagestreamimage"), imageID, fmt.Errorf("multiple images match the prefix %q: %s", imageID, strings.Join(set.List(), ", "))) } }
func TestCreateMissingDeploymentConfig(t *testing.T) { oc := &testclient.Fake{} oc.AddReactor("get", "deploymentconfigs", func(action ktestclient.Action) (handled bool, ret runtime.Object, err error) { dc := deploytest.OkDeploymentConfig(2) return true, nil, kerrors.NewNotFound(deployapi.Resource("deploymentConfig"), dc.Name) }) kc := &ktestclient.Fake{} kc.AddReactor("get", "replicationcontrollers", func(action ktestclient.Action) (handled bool, ret runtime.Object, err error) { deployment, _ := deployutil.MakeDeployment(deploytest.OkDeploymentConfig(1), codec) return true, deployment, nil }) obj, err := NewREST(oc, kc, codec).Create(kapi.NewDefaultContext(), &deployapi.DeploymentConfigRollback{ Name: "config", Spec: deployapi.DeploymentConfigRollbackSpec{ Revision: 1, }, }) if err == nil { t.Errorf("Expected an error") } if obj != nil { t.Error("Unexpected result obj") } }
// Get returns the ConfigMap by name. func (mock *MockConfigMapsInterface) Get(name string) (*api.ConfigMap, error) { object, ok := mock.objects[name] if !ok { return nil, kberrs.NewNotFound(api.Resource("tests"), name) } return object, nil }
func (r *ScaleREST) Update(ctx api.Context, obj runtime.Object) (runtime.Object, bool, error) { if obj == nil { return nil, false, errors.NewBadRequest(fmt.Sprintf("nil update passed to Scale")) } scale, ok := obj.(*extensions.Scale) if !ok { return nil, false, errors.NewBadRequest(fmt.Sprintf("expected input object type to be Scale, but %T", obj)) } if errs := extvalidation.ValidateScale(scale); len(errs) > 0 { return nil, false, errors.NewInvalid(extensions.Kind("Scale"), scale.Name, errs) } deployment, err := r.registry.GetDeployment(ctx, scale.Name) if err != nil { return nil, false, errors.NewNotFound(extensions.Resource("deployments/scale"), scale.Name) } deployment.Spec.Replicas = scale.Spec.Replicas deployment.ResourceVersion = scale.ResourceVersion deployment, err = r.registry.UpdateDeployment(ctx, deployment) if err != nil { return nil, false, err } newScale, err := scaleFromDeployment(deployment) if err != nil { return nil, false, errors.NewBadRequest(fmt.Sprintf("%v", err)) } return newScale, false, nil }
// NewNotFound is a utility function to return a well-formatted admission control error response func NewNotFound(a Attributes) error { name, kind, err := extractKindName(a) if err != nil { return apierrors.NewInternalError(err) } return apierrors.NewNotFound(kind.Kind, name) }
// Update scales the DeploymentConfig for the given Scale subresource, returning the updated Scale. func (r *ScaleREST) Update(ctx kapi.Context, obj runtime.Object) (runtime.Object, bool, error) { if obj == nil { return nil, false, errors.NewBadRequest(fmt.Sprintf("nil update passed to Scale")) } scale, ok := obj.(*extensions.Scale) if !ok { return nil, false, errors.NewBadRequest(fmt.Sprintf("wrong object passed to Scale update: %v", obj)) } // fake an existing object to validate existing := &extensions.Scale{ ObjectMeta: kapi.ObjectMeta{ Name: scale.Name, CreationTimestamp: scale.CreationTimestamp, }, } if existing.Namespace, ok = kapi.NamespaceFrom(ctx); !ok { existing.Namespace = scale.Namespace } if errs := extvalidation.ValidateScaleUpdate(scale, existing); len(errs) > 0 { return nil, false, errors.NewInvalid("scale", scale.Name, errs) } deploymentConfig, err := r.registry.GetDeploymentConfig(ctx, scale.Name) if err != nil { return nil, false, errors.NewNotFound("scale", scale.Name) } scaleRet := &extensions.Scale{ ObjectMeta: kapi.ObjectMeta{ Name: deploymentConfig.Name, Namespace: deploymentConfig.Namespace, CreationTimestamp: deploymentConfig.CreationTimestamp, }, Spec: extensions.ScaleSpec{ Replicas: scale.Spec.Replicas, }, Status: extensions.ScaleStatus{ Selector: deploymentConfig.Spec.Selector, }, } // TODO(directxman12): this is going to be a bit out of sync, since we are calculating it // here and not as part of the deploymentconfig loop -- is there a better way of doing it? totalReplicas, err := r.replicasForDeploymentConfig(deploymentConfig.Namespace, deploymentConfig.Name) if err != nil { return nil, false, err } oldReplicas := deploymentConfig.Spec.Replicas deploymentConfig.Spec.Replicas = scale.Spec.Replicas if err := r.registry.UpdateDeploymentConfig(ctx, deploymentConfig); err != nil { return nil, false, err } scaleRet.Status.Replicas = totalReplicas + (scale.Spec.Replicas - oldReplicas) return scaleRet, false, nil }
func (t *tracker) Delete(gvk schema.GroupVersionKind, ns, name string) error { if err := checkNamespace(gvk, ns); err != nil { return err } t.lock.Lock() defer t.lock.Unlock() found := false for i, existingObj := range t.objects[gvk] { objMeta, err := meta.Accessor(existingObj) if err != nil { return err } if objMeta.GetNamespace() == ns && objMeta.GetName() == name { t.objects[gvk] = append(t.objects[gvk][:i], t.objects[gvk][i+1:]...) found = true break } } if found { return nil } return errors.NewNotFound(schema.GroupResource{Group: gvk.Group, Resource: gvk.Kind}, name) }
// Update scales the DeploymentConfig for the given Scale subresource, returning the updated Scale. func (r *ScaleREST) Update(ctx kapi.Context, name string, objInfo rest.UpdatedObjectInfo) (runtime.Object, bool, error) { deploymentConfig, err := r.registry.GetDeploymentConfig(ctx, name) if err != nil { return nil, false, errors.NewNotFound(extensions.Resource("scale"), name) } old := api.ScaleFromConfig(deploymentConfig) obj, err := objInfo.UpdatedObject(ctx, old) if err != nil { return nil, false, err } scale, ok := obj.(*extensions.Scale) if !ok { return nil, false, errors.NewBadRequest(fmt.Sprintf("wrong object passed to Scale update: %v", obj)) } if errs := extvalidation.ValidateScale(scale); len(errs) > 0 { return nil, false, errors.NewInvalid(extensions.Kind("Scale"), scale.Name, errs) } deploymentConfig.Spec.Replicas = scale.Spec.Replicas if err := r.registry.UpdateDeploymentConfig(ctx, deploymentConfig); err != nil { return nil, false, err } return scale, false, nil }
func (c *mockControllerClient) GetPersistentVolumeClaim(namespace, name string) (*api.PersistentVolumeClaim, error) { if c.claim != nil { return c.claim, nil } else { return nil, errors.NewNotFound(api.Resource("persistentvolumes"), name) } }
func (r *ScaleREST) Update(ctx api.Context, obj runtime.Object) (runtime.Object, bool, error) { if obj == nil { return nil, false, errors.NewBadRequest(fmt.Sprintf("nil update passed to Scale")) } scale, ok := obj.(*extensions.Scale) if !ok { return nil, false, errors.NewBadRequest(fmt.Sprintf("wrong object passed to Scale update: %v", obj)) } if errs := extvalidation.ValidateScale(scale); len(errs) > 0 { return nil, false, errors.NewInvalid(extensions.Kind("Scale"), scale.Name, errs) } rc, err := (*r.registry).GetController(ctx, scale.Name) if err != nil { return nil, false, errors.NewNotFound(extensions.Resource("replicationcontrollers/scale"), scale.Name) } rc.Spec.Replicas = scale.Spec.Replicas rc.ResourceVersion = scale.ResourceVersion rc, err = (*r.registry).UpdateController(ctx, rc) if err != nil { return nil, false, errors.NewConflict(extensions.Resource("replicationcontrollers/scale"), scale.Name, err) } return scaleFromRC(rc), false, nil }
func (m *VirtualStorage) Get(ctx kapi.Context, name string) (runtime.Object, error) { policy, err := m.PolicyStorage.GetPolicy(ctx, authorizationapi.PolicyName) if err != nil && kapierrors.IsNotFound(err) { return nil, kapierrors.NewNotFound("Role", name) } if err != nil { return nil, err } role, exists := policy.Roles[name] if !exists { return nil, kapierrors.NewNotFound("Role", name) } return role, nil }
// Delete removes a tag from a stream. `id` is of the format <stream name>:<tag>. // The associated image that the tag points to is *not* deleted. // The tag history remains intact and is not deleted. func (r *REST) Delete(ctx kapi.Context, id string) (runtime.Object, error) { name, tag, err := nameAndTag(id) if err != nil { return nil, err } stream, err := r.imageStreamRegistry.GetImageStream(ctx, name) if err != nil { return nil, err } notFound := true // Try to delete the status tag if _, ok := stream.Status.Tags[tag]; ok { delete(stream.Status.Tags, tag) notFound = false } // Try to delete the spec tag if _, ok := stream.Spec.Tags[tag]; ok { delete(stream.Spec.Tags, tag) notFound = false } if notFound { return nil, kapierrors.NewNotFound("imageStreamTag", tag) } if _, err = r.imageStreamRegistry.UpdateImageStream(ctx, stream); err != nil { return nil, fmt.Errorf("cannot remove tag from image stream: %v", err) } return &unversioned.Status{Status: unversioned.StatusSuccess}, nil }
// PodContainerRunning returns false until the named container has ContainerStatus running (at least once), // and will return an error if the pod is deleted, runs to completion, or the container pod is not available. func PodContainerRunning(containerName string) WatchConditionFunc { return func(event watch.Event) (bool, error) { switch event.Type { case watch.Deleted: return false, kapierrors.NewNotFound(unversioned.GroupResource{Resource: "pods"}, "") } switch t := event.Object.(type) { case *kapi.Pod: switch t.Status.Phase { case kapi.PodRunning, kapi.PodPending: case kapi.PodFailed, kapi.PodSucceeded: return false, ErrPodCompleted default: return false, nil } for _, s := range t.Status.ContainerStatuses { if s.Name != containerName { continue } return s.State.Running != nil, nil } return false, nil } return false, nil } }
func (r *ScaleREST) Update(ctx api.Context, obj runtime.Object) (runtime.Object, bool, error) { if obj == nil { return nil, false, errors.NewBadRequest(fmt.Sprintf("nil update passed to Scale")) } scale, ok := obj.(*experimental.Scale) if !ok { return nil, false, errors.NewBadRequest(fmt.Sprintf("wrong object passed to Scale update: %v", obj)) } rc, err := (*r.registry).GetController(ctx, scale.Name) if err != nil { return nil, false, errors.NewNotFound("scale", scale.Name) } rc.Spec.Replicas = scale.Spec.Replicas rc, err = (*r.registry).UpdateController(ctx, rc) if err != nil { return nil, false, errors.NewConflict("scale", scale.Name, err) } return &experimental.Scale{ ObjectMeta: api.ObjectMeta{ Name: rc.Name, Namespace: rc.Namespace, CreationTimestamp: rc.CreationTimestamp, }, Spec: experimental.ScaleSpec{ Replicas: rc.Spec.Replicas, }, Status: experimental.ScaleStatus{ Replicas: rc.Status.Replicas, Selector: rc.Spec.Selector, }, }, false, nil }