package util import ( "fmt" "time" 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 }