// open returns a client with no garbage collection. func (c *Config) open(logger logrus.FieldLogger) (*client, error) { if c.InCluster && (c.KubeConfigFile != "") { return nil, errors.New("cannot specify both 'inCluster' and 'kubeConfigFile'") } if !c.InCluster && (c.KubeConfigFile == "") { return nil, errors.New("must specify either 'inCluster' or 'kubeConfigFile'") } var ( cluster k8sapi.Cluster user k8sapi.AuthInfo namespace string err error ) if c.InCluster { cluster, user, namespace, err = inClusterConfig() } else { cluster, user, namespace, err = loadKubeConfig(c.KubeConfigFile) } if err != nil { return nil, err } cli, err := newClient(cluster, user, namespace, logger) if err != nil { return nil, fmt.Errorf("create client: %v", err) } ctx, cancel := context.WithCancel(context.Background()) // Try to synchronously create the third party resources once. This doesn't mean // they'll immediately be available, but ensures that the client will actually try // once. if err := cli.createThirdPartyResources(); err != nil { logger.Errorf("failed creating third party resources: %v", err) go func() { for { if err := cli.createThirdPartyResources(); err != nil { logger.Errorf("failed creating third party resources: %v", err) } else { return } select { case <-ctx.Done(): return case <-time.After(30 * time.Second): } } }() } // If the client is closed, stop trying to create third party resources. cli.cancel = cancel return cli, nil }