// Update updates an existing node api object // by looking up the given hostname. // The updated node merges the given slave attribute labels // and annotations with the found api object. func Update( client *clientset.Clientset, hostname string, slaveAttrLabels, annotations map[string]string, ) (n *api.Node, err error) { for i := 0; i < clientRetryCount; i++ { n, err = client.Nodes().Get(hostname) if err != nil { return nil, fmt.Errorf("error getting node %q: %v", hostname, err) } if n == nil { return nil, fmt.Errorf("no node instance returned for %q", hostname) } // update labels derived from Mesos slave attributes, keep all other labels n.Labels = mergeMaps( filterMap(n.Labels, IsNotSlaveAttributeLabel), slaveAttrLabels, ) n.Annotations = mergeMaps(n.Annotations, annotations) n, err = client.Nodes().Update(n) if err == nil && !errors.IsConflict(err) { return n, nil } log.Infof("retry %d/%d: error updating node %v err %v", i, clientRetryCount, n, err) time.Sleep(time.Duration(i) * clientRetryInterval) } return nil, err }
func getReferencedServiceAccountToken(c *clientset.Clientset, ns string, name string, shouldWait bool) (string, string, error) { tokenName := "" token := "" findToken := func() (bool, error) { user, err := c.Legacy().ServiceAccounts(ns).Get(name) if errors.IsNotFound(err) { return false, nil } if err != nil { return false, err } for _, ref := range user.Secrets { secret, err := c.Legacy().Secrets(ns).Get(ref.Name) if errors.IsNotFound(err) { continue } if err != nil { return false, err } if secret.Type != api.SecretTypeServiceAccountToken { continue } name := secret.Annotations[api.ServiceAccountNameKey] uid := secret.Annotations[api.ServiceAccountUIDKey] tokenData := secret.Data[api.ServiceAccountTokenKey] if name == user.Name && uid == string(user.UID) && len(tokenData) > 0 { tokenName = secret.Name token = string(tokenData) return true, nil } } return false, nil } if shouldWait { err := wait.Poll(time.Second, 10*time.Second, findToken) if err != nil { return "", "", err } } else { ok, err := findToken() if err != nil { return "", "", err } if !ok { return "", "", fmt.Errorf("No token found for %s/%s", ns, name) } } return tokenName, token, nil }
func doServiceAccountAPIRequests(t *testing.T, c *clientset.Clientset, ns string, authenticated bool, canRead bool, canWrite bool) { testSecret := &api.Secret{ ObjectMeta: api.ObjectMeta{Name: "testSecret"}, Data: map[string][]byte{"test": []byte("data")}, } readOps := []testOperation{ func() error { _, err := c.Legacy().Secrets(ns).List(api.ListOptions{}) return err }, func() error { _, err := c.Legacy().Pods(ns).List(api.ListOptions{}) return err }, } writeOps := []testOperation{ func() error { _, err := c.Legacy().Secrets(ns).Create(testSecret); return err }, func() error { return c.Legacy().Secrets(ns).Delete(testSecret.Name, nil) }, } for _, op := range readOps { err := op() unauthorizedError := errors.IsUnauthorized(err) forbiddenError := errors.IsForbidden(err) switch { case !authenticated && !unauthorizedError: t.Fatalf("expected unauthorized error, got %v", err) case authenticated && unauthorizedError: t.Fatalf("unexpected unauthorized error: %v", err) case authenticated && canRead && forbiddenError: t.Fatalf("unexpected forbidden error: %v", err) case authenticated && !canRead && !forbiddenError: t.Fatalf("expected forbidden error, got: %v", err) } } for _, op := range writeOps { err := op() unauthorizedError := errors.IsUnauthorized(err) forbiddenError := errors.IsForbidden(err) switch { case !authenticated && !unauthorizedError: t.Fatalf("expected unauthorized error, got %v", err) case authenticated && unauthorizedError: t.Fatalf("unexpected unauthorized error: %v", err) case authenticated && canWrite && forbiddenError: t.Fatalf("unexpected forbidden error: %v", err) case authenticated && !canWrite && !forbiddenError: t.Fatalf("expected forbidden error, got: %v", err) } } }
func getServiceAccount(c *clientset.Clientset, ns string, name string, shouldWait bool) (*api.ServiceAccount, error) { if !shouldWait { return c.Legacy().ServiceAccounts(ns).Get(name) } var user *api.ServiceAccount var err error err = wait.Poll(time.Second, 10*time.Second, func() (bool, error) { user, err = c.Legacy().ServiceAccounts(ns).Get(name) if errors.IsNotFound(err) { return false, nil } if err != nil { return false, err } return true, nil }) return user, err }
// Create creates a new node api object with the given hostname, // slave attribute labels and annotations func Create( client *clientset.Clientset, hostName string, slaveAttrLabels, annotations map[string]string, ) (*api.Node, error) { n := api.Node{ ObjectMeta: api.ObjectMeta{ Name: hostName, }, Spec: api.NodeSpec{ ExternalID: hostName, }, Status: api.NodeStatus{ Phase: api.NodePending, // WORKAROUND(sttts): make sure that the Ready condition is the // first one. The kube-ui v3 depends on this assumption. // TODO(sttts): remove this workaround when kube-ui v4 is used or we // merge this with the statusupdate in the controller manager. Conditions: []api.NodeCondition{ { Type: api.NodeReady, Status: api.ConditionTrue, Reason: slaveReadyReason, Message: slaveReadyMessage, LastHeartbeatTime: unversioned.Now(), }, }, }, } n.Labels = mergeMaps( map[string]string{"kubernetes.io/hostname": hostName}, slaveAttrLabels, ) n.Annotations = annotations // try to create return client.Nodes().Create(&n) }
// checkDeploymentRevision checks if the input deployment's and its new RC's revision and images are as expected. func checkDeploymentRevision(c *clientset.Clientset, ns, deploymentName, revision, imageName, image string) (*extensions.Deployment, *api.ReplicationController) { deployment, err := c.Extensions().Deployments(ns).Get(deploymentName) Expect(err).NotTo(HaveOccurred()) // Check revision of the new RC of this deployment newRC, err := deploymentutil.GetNewRC(*deployment, c) Expect(err).NotTo(HaveOccurred()) Expect(newRC.Annotations).NotTo(Equal(nil)) Expect(newRC.Annotations[deploymentutil.RevisionAnnotation]).Should(Equal(revision)) // Check revision of This deployment Expect(deployment.Annotations).NotTo(Equal(nil)) Expect(deployment.Annotations[deploymentutil.RevisionAnnotation]).Should(Equal(revision)) if len(imageName) > 0 { // Check the image the new RC creates Expect(newRC.Spec.Template.Spec.Containers[0].Name).Should(Equal(imageName)) Expect(newRC.Spec.Template.Spec.Containers[0].Image).Should(Equal(image)) // Check the image the deployment creates Expect(deployment.Spec.Template.Spec.Containers[0].Name).Should(Equal(imageName)) Expect(deployment.Spec.Template.Spec.Containers[0].Image).Should(Equal(image)) } return deployment, newRC }