package util import ( "fmt" "time" "k8s.io/api/core/v1" apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" apiextensionsclient "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/errors" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" ) const ( defaultQPS = 100 defaultBurst = 100 ) // NewClusterConfig builds a kubernetes cluster config. func NewClusterConfig(kubeConfig string) (*rest.Config, error) { var cfg *rest.Config var err error if kubeConfig != "" { cfg, err = clientcmd.BuildConfigFromFlags("", kubeConfig) } else { cfg, err = rest.InClusterConfig() } if err != nil { return nil, err } // Setup default QPS and burst. cfg.QPS = defaultQPS cfg.Burst = defaultBurst return cfg, nil } func WaitForCRDReady(clientset apiextensionsclient.Interface, crdName string) error { err := wait.Poll(500*time.Millisecond, 60*time.Second, func() (bool, error) { crd, err := clientset.ApiextensionsV1beta1().CustomResourceDefinitions().Get(crdName, metav1.GetOptions{}) if err != nil { return false, err } for _, cond := range crd.Status.Conditions { switch cond.Type { case apiextensionsv1beta1.Established: if cond.Status == apiextensionsv1beta1.ConditionTrue { return true, err } case apiextensionsv1beta1.NamesAccepted: if cond.Status == apiextensionsv1beta1.ConditionFalse { return false, fmt.Errorf("Name conflict when creating CRD: %v\n", cond.Reason) } } } return false, err }) if err != nil { deleteErr := clientset.ApiextensionsV1beta1().CustomResourceDefinitions().Delete(crdName, nil) if deleteErr != nil { return errors.NewAggregate([]error{err, deleteErr}) } return err } return nil } func LoadBalancerStatusDeepCopy(lb *v1.LoadBalancerStatus) *v1.LoadBalancerStatus { c := &v1.LoadBalancerStatus{} c.Ingress = make([]v1.LoadBalancerIngress, len(lb.Ingress)) for i := range lb.Ingress { c.Ingress[i] = lb.Ingress[i] } return c } func LoadBalancerStatusEqual(l, r *v1.LoadBalancerStatus) bool { return ingressSliceEqual(l.Ingress, r.Ingress) } func ingressSliceEqual(lhs, rhs []v1.LoadBalancerIngress) bool { if len(lhs) != len(rhs) { return false } for i := range lhs { if !ingressEqual(&lhs[i], &rhs[i]) { return false } } return true } func ingressEqual(lhs, rhs *v1.LoadBalancerIngress) bool { if lhs.IP != rhs.IP { return false } if lhs.Hostname != rhs.Hostname { return false } return true }