func updateIngressOrFail(clientset *fedclientset.Clientset, namespace string) (newIng *v1beta1.Ingress) { var err error if clientset == nil || len(namespace) == 0 { Fail(fmt.Sprintf("Internal error: invalid parameters passed to createIngressOrFail: clientset: %v, namespace: %v", clientset, namespace)) } ingress := &v1beta1.Ingress{ ObjectMeta: metav1.ObjectMeta{ Name: FederatedIngressName, }, Spec: v1beta1.IngressSpec{ Backend: &v1beta1.IngressBackend{ ServiceName: "updated-testingress-service", ServicePort: intstr.FromInt(80), }, }, } err = waitForFederatedIngressExists(clientset, namespace, FederatedIngressName, FederatedIngressTimeout) if err != nil { framework.Failf("failed to get ingress %q: %v", FederatedIngressName, err) } for i := 0; i < MaxRetriesOnFederatedApiserver; i++ { newIng, err = clientset.Extensions().Ingresses(namespace).Update(ingress) if err == nil { framework.DescribeIng(namespace) return newIng } if !errors.IsConflict(err) && !errors.IsServerTimeout(err) { framework.Failf("failed to update ingress %q: %v", FederatedIngressName, err) } } framework.Failf("too many retries updating ingress %q", FederatedIngressName) return nil }
func updateSecretOrFail(clientset *fedclientset.Clientset, nsName string, secretName string) *v1.Secret { if clientset == nil || len(nsName) == 0 { Fail(fmt.Sprintf("Internal error: invalid parameters passed to updateSecretOrFail: clientset: %v, namespace: %v", clientset, nsName)) } var newSecret *v1.Secret for retryCount := 0; retryCount < MaxRetries; retryCount++ { secret, err := clientset.Core().Secrets(nsName).Get(secretName, metav1.GetOptions{}) if err != nil { framework.Failf("failed to get secret %q: %v", secretName, err) } // Update one of the data in the secret. secret.Data = map[string][]byte{ "key": []byte("value"), } newSecret, err = clientset.Core().Secrets(nsName).Update(secret) if err == nil { return newSecret } if !errors.IsConflict(err) && !errors.IsServerTimeout(err) { framework.Failf("failed to update secret %q: %v", secretName, err) } } framework.Failf("too many retries updating secret %q", secretName) return newSecret }
func updateDaemonSetOrFail(clientset *fedclientset.Clientset, namespace string) *v1beta1.DaemonSet { if clientset == nil || len(namespace) == 0 { Fail(fmt.Sprintf("Internal error: invalid parameters passed to updateDaemonSetOrFail: clientset: %v, namespace: %v", clientset, namespace)) } var newDaemonSet *v1beta1.DaemonSet for retryCount := 0; retryCount < FederatedDaemonSetMaxRetries; retryCount++ { daemonset, err := clientset.Extensions().DaemonSets(namespace).Get(FederatedDaemonSetName, metav1.GetOptions{}) if err != nil { framework.Failf("failed to get daemonset %q: %v", FederatedDaemonSetName, err) } // Update one of the data in the daemonset. daemonset.Annotations = map[string]string{"ccc": "ddd"} newDaemonSet, err = clientset.Extensions().DaemonSets(namespace).Update(daemonset) if err == nil { return newDaemonSet } if !errors.IsConflict(err) && !errors.IsServerTimeout(err) { framework.Failf("failed to update daemonset %q: %v", FederatedDaemonSetName, err) } } framework.Failf("too many retries updating daemonset %q", FederatedDaemonSetName) return newDaemonSet }
// UpdateService fetches a service, calls the update function on it, and // then attempts to send the updated service. It tries up to 3 times in the // face of timeouts and conflicts. func (j *ServiceTestJig) UpdateService(namespace, name string, update func(*v1.Service)) (*v1.Service, error) { for i := 0; i < 3; i++ { service, err := j.Client.Core().Services(namespace).Get(name, metav1.GetOptions{}) if err != nil { return nil, fmt.Errorf("Failed to get Service %q: %v", name, err) } update(service) service, err = j.Client.Core().Services(namespace).Update(service) if err == nil { return service, nil } if !errors.IsConflict(err) && !errors.IsServerTimeout(err) { return nil, fmt.Errorf("Failed to update Service %q: %v", name, err) } } return nil, fmt.Errorf("Too many retries updating Service %q", name) }
func (s *statefulSetTester) update(ns, name string, update func(ss *apps.StatefulSet)) { for i := 0; i < 3; i++ { ss, err := s.c.Apps().StatefulSets(ns).Get(name, metav1.GetOptions{}) if err != nil { framework.Failf("failed to get statefulset %q: %v", name, err) } update(ss) ss, err = s.c.Apps().StatefulSets(ns).Update(ss) if err == nil { return } if !apierrs.IsConflict(err) && !apierrs.IsServerTimeout(err) { framework.Failf("failed to update statefulset %q: %v", name, err) } } framework.Failf("too many retries draining statefulset %q", name) }
// UpdateService fetches a service, calls the update function on it, // and then attempts to send the updated service. It retries up to 2 // times in the face of timeouts and conflicts. func UpdateService(c clientset.Interface, namespace, serviceName string, update func(*v1.Service)) (*v1.Service, error) { var service *v1.Service var err error for i := 0; i < 3; i++ { service, err = c.Core().Services(namespace).Get(serviceName, metav1.GetOptions{}) if err != nil { return service, err } update(service) service, err = c.Core().Services(namespace).Update(service) if !errors.IsConflict(err) && !errors.IsServerTimeout(err) { return service, err } } return service, err }
func (j *testJig) update(update func(ing *extensions.Ingress)) { var err error ns, name := j.ing.Namespace, j.ing.Name for i := 0; i < 3; i++ { j.ing, err = j.client.Extensions().Ingresses(ns).Get(name, metav1.GetOptions{}) if err != nil { framework.Failf("failed to get ingress %q: %v", name, err) } update(j.ing) j.ing, err = j.client.Extensions().Ingresses(ns).Update(j.ing) if err == nil { framework.DescribeIng(j.ing.Namespace) return } if !apierrs.IsConflict(err) && !apierrs.IsServerTimeout(err) { framework.Failf("failed to update ingress %q: %v", name, err) } } framework.Failf("too many retries updating ingress %q", name) }
// Assigns CIDR to Node and sends an update to the API server. func (r *rangeAllocator) updateCIDRAllocation(data nodeAndCIDR) error { var err error var node *v1.Node defer r.removeNodeFromProcessing(data.nodeName) for rep := 0; rep < podCIDRUpdateRetry; rep++ { // TODO: change it to using PATCH instead of full Node updates. node, err = r.client.Core().Nodes().Get(data.nodeName, metav1.GetOptions{}) if err != nil { glog.Errorf("Failed while getting node %v to retry updating Node.Spec.PodCIDR: %v", data.nodeName, err) continue } if node.Spec.PodCIDR != "" { glog.Errorf("Node %v already has allocated CIDR %v. Releasing assigned one if different.", node.Name, node.Spec.PodCIDR) if node.Spec.PodCIDR != data.cidr.String() { if err := r.cidrs.release(data.cidr); err != nil { glog.Errorf("Error when releasing CIDR %v", data.cidr.String()) } } return nil } node.Spec.PodCIDR = data.cidr.String() if _, err := r.client.Core().Nodes().Update(node); err != nil { glog.Errorf("Failed while updating Node.Spec.PodCIDR (%d retries left): %v", podCIDRUpdateRetry-rep-1, err) } else { break } } if err != nil { recordNodeStatusChange(r.recorder, node, "CIDRAssignmentFailed") // We accept the fact that we may leek CIDRs here. This is safer than releasing // them in case when we don't know if request went through. // NodeController restart will return all falsely allocated CIDRs to the pool. if !apierrors.IsServerTimeout(err) { glog.Errorf("CIDR assignment for node %v failed: %v. Releasing allocated CIDR", data.nodeName, err) if releaseErr := r.cidrs.release(data.cidr); releaseErr != nil { glog.Errorf("Error releasing allocated CIDR for node %v: %v", data.nodeName, releaseErr) } } } return err }
func TestAssignsDefaultServiceAccountAndRejectsMissingAPIToken(t *testing.T) { ns := "myns" admit := NewServiceAccount() admit.SetInternalClientSet(nil) admit.MountServiceAccountToken = true admit.RequireAPIToken = true // Add the default service account for the ns into the cache admit.serviceAccounts.Add(&api.ServiceAccount{ ObjectMeta: metav1.ObjectMeta{ Name: DefaultServiceAccountName, Namespace: ns, }, }) pod := &api.Pod{} attrs := admission.NewAttributesRecord(pod, nil, api.Kind("Pod").WithVersion("version"), ns, "myname", api.Resource("pods").WithVersion("version"), "", admission.Create, nil) err := admit.Admit(attrs) if err == nil || !errors.IsServerTimeout(err) { t.Errorf("Expected server timeout error for missing API token: %v", err) } }
func TestCheckGeneratedNameError(t *testing.T) { expect := errors.NewNotFound(api.Resource("foos"), "bar") if err := rest.CheckGeneratedNameError(Strategy, expect, &api.Pod{}); err != expect { t.Errorf("NotFoundError should be ignored: %v", err) } expect = errors.NewAlreadyExists(api.Resource("foos"), "bar") if err := rest.CheckGeneratedNameError(Strategy, expect, &api.Pod{}); err != expect { t.Errorf("AlreadyExists should be returned when no GenerateName field: %v", err) } expect = errors.NewAlreadyExists(api.Resource("foos"), "bar") if err := rest.CheckGeneratedNameError(Strategy, expect, &api.Pod{ObjectMeta: metav1.ObjectMeta{GenerateName: "foo"}}); err == nil || !errors.IsServerTimeout(err) { t.Errorf("expected try again later error: %v", err) } }