func deleteServiceOrFail(clientset *fedclientset.Clientset, namespace string, serviceName string) { if clientset == nil || len(namespace) == 0 || len(serviceName) == 0 { Fail(fmt.Sprintf("Internal error: invalid parameters passed to deleteServiceOrFail: clientset: %v, namespace: %v, service: %v", clientset, namespace, serviceName)) } err := clientset.Services(namespace).Delete(serviceName, v1.NewDeleteOptions(0)) framework.ExpectNoError(err, "Error deleting service %q from namespace %q", serviceName, namespace) }
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 waitForReplicaSet(c *fedclientset.Clientset, namespace string, replicaSetName string, clusters map[string]*cluster) error { err := wait.Poll(10*time.Second, FederatedReplicaSetTimeout, func() (bool, error) { frs, err := c.ReplicaSets(namespace).Get(replicaSetName, metav1.GetOptions{}) if err != nil { return false, err } specReplicas, statusReplicas := int32(0), int32(0) for _, cluster := range clusters { rs, err := cluster.ReplicaSets(namespace).Get(replicaSetName, metav1.GetOptions{}) if err != nil && !errors.IsNotFound(err) { By(fmt.Sprintf("Failed getting replicaset: %q/%q/%q, err: %v", cluster.name, namespace, replicaSetName, err)) return false, err } if err == nil { if !equivalentReplicaSet(frs, rs) { By(fmt.Sprintf("Replicaset meta or spec not match for cluster %q:\n federation: %v\n cluster: %v", cluster.name, frs, rs)) return false, nil } specReplicas += *rs.Spec.Replicas statusReplicas += rs.Status.Replicas } } if statusReplicas == frs.Status.Replicas && specReplicas >= *frs.Spec.Replicas { return true, nil } By(fmt.Sprintf("Replicas not match, federation replicas: %v/%v, clusters replicas: %v/%v\n", *frs.Spec.Replicas, frs.Status.Replicas, specReplicas, statusReplicas)) return false, nil }) return err }
func createEventOrFail(clientset *federation_clientset.Clientset, namespace string) *v1.Event { if clientset == nil || len(namespace) == 0 { Fail(fmt.Sprintf("Internal error: invalid parameters passed to createEventOrFail: clientset: %v, namespace: %v", clientset, namespace)) } By(fmt.Sprintf("Creating federated event %q in namespace %q", FederationEventName, namespace)) event := &v1.Event{ ObjectMeta: v1.ObjectMeta{ Name: FederationEventName, Namespace: namespace, }, InvolvedObject: v1.ObjectReference{ Kind: "Pod", Name: "pod-name", Namespace: namespace, UID: "C934D34AFB20242", APIVersion: "version", }, Source: v1.EventSource{ Component: "kubelet", Host: "kublet.node1", }, Count: 1, Type: v1.EventTypeNormal, } _, err := clientset.Core().Events(namespace).Create(event) framework.ExpectNoError(err, "Creating event %q in namespace %q", event.Name, namespace) By(fmt.Sprintf("Successfully created federated event %q in namespace %q", FederationEventName, namespace)) return event }
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 }
func createDaemonSetOrFail(clientset *fedclientset.Clientset, namespace string) *v1beta1.DaemonSet { if clientset == nil || len(namespace) == 0 { Fail(fmt.Sprintf("Internal error: invalid parameters passed to createDaemonSetOrFail: clientset: %v, namespace: %v", clientset, namespace)) } daemonset := &v1beta1.DaemonSet{ ObjectMeta: v1.ObjectMeta{ Name: FederatedDaemonSetName, Namespace: namespace, }, Spec: v1beta1.DaemonSetSpec{ Template: v1.PodTemplateSpec{ ObjectMeta: v1.ObjectMeta{ Labels: map[string]string{"aaa": "bbb"}, }, Spec: v1.PodSpec{ Containers: []v1.Container{ { Name: "container1", Image: "gcr.io/google_containers/serve_hostname:v1.4", Ports: []v1.ContainerPort{{ContainerPort: 9376}}, }, }, }, }, }, } By(fmt.Sprintf("Creating daemonset %q in namespace %q", daemonset.Name, namespace)) _, err := clientset.Extensions().DaemonSets(namespace).Create(daemonset) framework.ExpectNoError(err, "Failed to create daemonset %s", daemonset.Name) By(fmt.Sprintf("Successfully created federated daemonset %q in namespace %q", FederatedDaemonSetName, namespace)) return daemonset }
func createService(clientset *fedclientset.Clientset, namespace, name string) (*v1.Service, error) { if clientset == nil || len(namespace) == 0 { return nil, fmt.Errorf("Internal error: invalid parameters passed to createService: clientset: %v, namespace: %v", clientset, namespace) } By(fmt.Sprintf("Creating federated service %q in namespace %q", name, namespace)) service := &v1.Service{ ObjectMeta: v1.ObjectMeta{ Name: name, Namespace: namespace, }, Spec: v1.ServiceSpec{ Selector: FederatedServiceLabels, Type: "LoadBalancer", Ports: []v1.ServicePort{ { Name: "http", Protocol: v1.ProtocolTCP, Port: 80, TargetPort: intstr.FromInt(8080), }, }, SessionAffinity: v1.ServiceAffinityNone, }, } By(fmt.Sprintf("Trying to create service %q in namespace %q", service.Name, namespace)) return clientset.Services(namespace).Create(service) }
func waitForDeployment(c *fedclientset.Clientset, namespace string, deploymentName string, clusters map[string]*cluster) error { err := wait.Poll(10*time.Second, FederatedDeploymentTimeout, func() (bool, error) { fdep, err := c.Deployments(namespace).Get(deploymentName, metav1.GetOptions{}) if err != nil { return false, err } specReplicas, statusReplicas := int32(0), int32(0) for _, cluster := range clusters { dep, err := cluster.Deployments(namespace).Get(deploymentName, metav1.GetOptions{}) if err != nil && !errors.IsNotFound(err) { By(fmt.Sprintf("Failed getting deployment: %q/%q/%q, err: %v", cluster.name, namespace, deploymentName, err)) return false, err } if err == nil { if !verifyDeployment(fdep, dep) { By(fmt.Sprintf("Deployment meta or spec not match for cluster %q:\n federation: %v\n cluster: %v", cluster.name, fdep, dep)) return false, nil } specReplicas += *dep.Spec.Replicas statusReplicas += dep.Status.Replicas } } if statusReplicas == fdep.Status.Replicas && specReplicas >= *fdep.Spec.Replicas { return true, nil } By(fmt.Sprintf("Replicas not match, federation replicas: %v/%v, clusters replicas: %v/%v\n", *fdep.Spec.Replicas, fdep.Status.Replicas, specReplicas, statusReplicas)) return false, nil }) return err }
// deleteAllReplicaSetsOrFail deletes all replicasets in the given namespace name. func deleteAllReplicaSetsOrFail(clientset *fedclientset.Clientset, nsName string) { replicasetList, err := clientset.Extensions().ReplicaSets(nsName).List(v1.ListOptions{}) Expect(err).NotTo(HaveOccurred()) orphanDependents := false for _, replicaset := range replicasetList.Items { deleteReplicaSetOrFail(clientset, nsName, replicaset.Name, &orphanDependents) } }
// deleteAllSecretsOrFail deletes all secrets in the given namespace name. func deleteAllSecretsOrFail(clientset *fedclientset.Clientset, nsName string) { SecretList, err := clientset.Core().Secrets(nsName).List(v1.ListOptions{}) Expect(err).NotTo(HaveOccurred()) orphanDependents := false for _, Secret := range SecretList.Items { deleteSecretOrFail(clientset, nsName, Secret.Name, &orphanDependents) } }
// deleteAllDeploymentsOrFail deletes all deployments in the given namespace name. func deleteAllDeploymentsOrFail(clientset *fedclientset.Clientset, nsName string) { deploymentList, err := clientset.Extensions().Deployments(nsName).List(v1.ListOptions{}) Expect(err).NotTo(HaveOccurred()) orphanDependents := false for _, deployment := range deploymentList.Items { deleteDeploymentOrFail(clientset, nsName, deployment.Name, &orphanDependents) } }
// WaitForFederationApiserverReady waits for the federation apiserver to be ready. // It tests the readiness by sending a GET request and expecting a non error response. func WaitForFederationApiserverReady(c *federation_clientset.Clientset) error { return wait.PollImmediate(time.Second, 1*time.Minute, func() (bool, error) { _, err := c.Federation().Clusters().List(v1.ListOptions{}) if err != nil { return false, nil } return true, nil }) }
// waitForFederatedIngressExists waits for the Ingress object exists. func waitForFederatedIngressExists(c *fedclientset.Clientset, ns, ingName string, timeout time.Duration) error { err := wait.PollImmediate(10*time.Second, timeout, func() (bool, error) { _, err := c.Extensions().Ingresses(ns).Get(ingName, metav1.GetOptions{}) if err != nil { framework.Logf("Waiting for Ingress %v, error %v", ingName, err) return false, nil } return true, nil }) return err }
func createReplicaSetOrFail(clientset *fedclientset.Clientset, namespace string) *v1beta1.ReplicaSet { if clientset == nil || len(namespace) == 0 { Fail(fmt.Sprintf("Internal error: invalid parameters passed to createReplicaSetOrFail: clientset: %v, namespace: %v", clientset, namespace)) } By(fmt.Sprintf("Creating federation replicaset %q in namespace %q", FederationReplicaSetName, namespace)) replicaset := newReplicaSet(namespace, FederationReplicaSetName, 5) _, err := clientset.Extensions().ReplicaSets(namespace).Create(replicaset) framework.ExpectNoError(err, "Creating replicaset %q in namespace %q", replicaset.Name, namespace) By(fmt.Sprintf("Successfully created federation replicaset %q in namespace %q", FederationReplicaSetName, namespace)) return replicaset }
func createDeploymentOrFail(clientset *fedclientset.Clientset, namespace string) *v1beta1.Deployment { if clientset == nil || len(namespace) == 0 { Fail(fmt.Sprintf("Internal error: invalid parameters passed to createDeploymentOrFail: clientset: %v, namespace: %v", clientset, namespace)) } By(fmt.Sprintf("Creating federation deployment %q in namespace %q", FederationDeploymentName, namespace)) deployment := newDeploymentForFed(namespace, FederationDeploymentName, 5) _, err := clientset.Extensions().Deployments(namespace).Create(deployment) framework.ExpectNoError(err, "Creating deployment %q in namespace %q", deployment.Name, namespace) By(fmt.Sprintf("Successfully created federation deployment %q in namespace %q", FederationDeploymentName, namespace)) return deployment }
// Verify that the cluster is marked ready. func isReady(clusterName string, clientset *federation_clientset.Clientset) error { return wait.PollImmediate(time.Second, 5*time.Minute, func() (bool, error) { c, err := clientset.Federation().Clusters().Get(clusterName, metav1.GetOptions{}) if err != nil { return false, err } for _, condition := range c.Status.Conditions { if condition.Type == federationapi.ClusterReady && condition.Status == v1.ConditionTrue { return true, nil } } return false, nil }) }
// getFederatedIngressAddress returns the ips/hostnames associated with the Ingress. func getFederatedIngressAddress(client *fedclientset.Clientset, ns, name string) ([]string, error) { ing, err := client.Extensions().Ingresses(ns).Get(name, metav1.GetOptions{}) if err != nil { return nil, err } addresses := []string{} for _, a := range ing.Status.LoadBalancer.Ingress { if a.IP != "" { addresses = append(addresses, a.IP) } if a.Hostname != "" { addresses = append(addresses, a.Hostname) } } return addresses, nil }
func createSecretOrFail(clientset *fedclientset.Clientset, nsName string) *v1.Secret { if len(nsName) == 0 { Fail(fmt.Sprintf("Internal error: invalid parameters passed to createSecretOrFail: namespace: %v", nsName)) } secret := &v1.Secret{ ObjectMeta: metav1.ObjectMeta{ Name: v1.SimpleNameGenerator.GenerateName(secretNamePrefix), Namespace: nsName, }, } By(fmt.Sprintf("Creating secret %q in namespace %q", secret.Name, nsName)) _, err := clientset.Core().Secrets(nsName).Create(secret) framework.ExpectNoError(err, "Failed to create secret %s", secret.Name) By(fmt.Sprintf("Successfully created federated secret %q in namespace %q", secret.Name, nsName)) return secret }
func deleteReplicaSetOrFail(clientset *fedclientset.Clientset, nsName string, replicaSetName string, orphanDependents *bool) { By(fmt.Sprintf("Deleting replica set %q in namespace %q", replicaSetName, nsName)) err := clientset.Extensions().ReplicaSets(nsName).Delete(replicaSetName, &v1.DeleteOptions{OrphanDependents: orphanDependents}) framework.ExpectNoError(err, "Error deleting replica set %q in namespace %q", replicaSetName, nsName) // Wait for the replicaSet to be deleted. err = wait.Poll(5*time.Second, wait.ForeverTestTimeout, func() (bool, error) { _, err := clientset.Extensions().ReplicaSets(nsName).Get(replicaSetName, metav1.GetOptions{}) if err != nil && errors.IsNotFound(err) { return true, nil } return false, err }) if err != nil { framework.Failf("Error in deleting replica set %s: %v", replicaSetName, err) } }
func deleteServiceOrFail(clientset *fedclientset.Clientset, namespace string, serviceName string, orphanDependents *bool) { if clientset == nil || len(namespace) == 0 || len(serviceName) == 0 { Fail(fmt.Sprintf("Internal error: invalid parameters passed to deleteServiceOrFail: clientset: %v, namespace: %v, service: %v", clientset, namespace, serviceName)) } err := clientset.Services(namespace).Delete(serviceName, &v1.DeleteOptions{OrphanDependents: orphanDependents}) framework.ExpectNoError(err, "Error deleting service %q from namespace %q", serviceName, namespace) // Wait for the service to be deleted. err = wait.Poll(5*time.Second, 3*wait.ForeverTestTimeout, func() (bool, error) { _, err := clientset.Core().Services(namespace).Get(serviceName, metav1.GetOptions{}) if err != nil && errors.IsNotFound(err) { return true, nil } return false, err }) if err != nil { framework.Failf("Error in deleting service %s: %v", serviceName, err) } }
func deleteIngressOrFail(clientset *fedclientset.Clientset, namespace string, ingressName string, orphanDependents *bool) { if clientset == nil || len(namespace) == 0 || len(ingressName) == 0 { Fail(fmt.Sprintf("Internal error: invalid parameters passed to deleteIngressOrFail: clientset: %v, namespace: %v, ingress: %v", clientset, namespace, ingressName)) } err := clientset.Ingresses(namespace).Delete(ingressName, &v1.DeleteOptions{OrphanDependents: orphanDependents}) framework.ExpectNoError(err, "Error deleting ingress %q from namespace %q", ingressName, namespace) // Wait for the ingress to be deleted. err = wait.Poll(framework.Poll, wait.ForeverTestTimeout, func() (bool, error) { _, err := clientset.Extensions().Ingresses(namespace).Get(ingressName, metav1.GetOptions{}) if err != nil && errors.IsNotFound(err) { return true, nil } return false, err }) if err != nil { framework.Failf("Error in deleting ingress %s: %v", ingressName, err) } }
func createIngressOrFail(clientset *fedclientset.Clientset, namespace string) *v1beta1.Ingress { if clientset == nil || len(namespace) == 0 { Fail(fmt.Sprintf("Internal error: invalid parameters passed to createIngressOrFail: clientset: %v, namespace: %v", clientset, namespace)) } By(fmt.Sprintf("Creating federated ingress %q in namespace %q", FederatedIngressName, namespace)) ingress := &v1beta1.Ingress{ ObjectMeta: metav1.ObjectMeta{ Name: FederatedIngressName, }, Spec: v1beta1.IngressSpec{ Backend: &v1beta1.IngressBackend{ ServiceName: "testingress-service", ServicePort: intstr.FromInt(80), }, }, } newIng, err := clientset.Extensions().Ingresses(namespace).Create(ingress) framework.ExpectNoError(err, "Creating ingress %q in namespace %q", ingress.Name, namespace) By(fmt.Sprintf("Successfully created federated ingress %q in namespace %q", FederatedIngressName, namespace)) return newIng }
// Deletes all Ingresses in the given namespace name. func deleteAllIngressesOrFail(clientset *fedclientset.Clientset, nsName string) { orphanDependents := false err := clientset.Extensions().Ingresses(nsName).DeleteCollection(&v1.DeleteOptions{OrphanDependents: &orphanDependents}, v1.ListOptions{}) Expect(err).NotTo(HaveOccurred(), fmt.Sprintf("Error in deleting ingresses in namespace: %s", nsName)) }