func TestComputePlatformScopeSubstitutesStorageScope(t *testing.T) { const ( defaultEndpoint = "/computeMetadata/v1/instance/service-accounts/default/" scopeEndpoint = defaultEndpoint + "scopes" ) server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // Only serve the URL key and the value endpoint if scopeEndpoint == r.URL.Path { w.WriteHeader(http.StatusOK) w.Header().Set("Content-Type", "application/json") fmt.Fprint(w, `["https://www.googleapis.com/auth/compute.read_write","https://www.googleapis.com/auth/cloud-platform.read-only"]`) } else { w.WriteHeader(http.StatusNotFound) } })) defer server.Close() // Make a transport that reroutes all traffic to the example server transport := utilnet.SetTransportDefaults(&http.Transport{ Proxy: func(req *http.Request) (*url.URL, error) { return url.Parse(server.URL + req.URL.Path) }, }) provider := &containerRegistryProvider{ metadataProvider{Client: &http.Client{Transport: transport}}, } if !provider.Enabled() { t.Errorf("Provider is unexpectedly disabled") } }
// EtcdClient creates an etcd client based on the provided config. func EtcdClient(etcdClientInfo configapi.EtcdConnectionInfo) (*etcdclient.Client, error) { tlsConfig, err := client.TLSConfigFor(&client.Config{ TLSClientConfig: client.TLSClientConfig{ CertFile: etcdClientInfo.ClientCert.CertFile, KeyFile: etcdClientInfo.ClientCert.KeyFile, CAFile: etcdClientInfo.CA, }, }) if err != nil { return nil, err } transport := knet.SetTransportDefaults(&http.Transport{ TLSClientConfig: tlsConfig, Dial: (&net.Dialer{ // default from http.DefaultTransport Timeout: 30 * time.Second, // Lower the keep alive for connections. KeepAlive: 1 * time.Second, }).Dial, // Because watches are very bursty, defends against long delays in watch reconnections. MaxIdleConnsPerHost: 500, }) etcdClient := etcdclient.NewClient(etcdClientInfo.URLs) etcdClient.SetTransport(transport) etcdClient.CheckRetry = NeverRetryOnFailure return etcdClient, nil }
func TestAllProvidersNoMetadata(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNotFound) })) defer server.Close() // Make a transport that reroutes all traffic to the example server transport := utilnet.SetTransportDefaults(&http.Transport{ Proxy: func(req *http.Request) (*url.URL, error) { return url.Parse(server.URL + req.URL.Path) }, }) providers := []credentialprovider.DockerConfigProvider{ &dockerConfigKeyProvider{ metadataProvider{Client: &http.Client{Transport: transport}}, }, &dockerConfigUrlKeyProvider{ metadataProvider{Client: &http.Client{Transport: transport}}, }, &containerRegistryProvider{ metadataProvider{Client: &http.Client{Transport: transport}}, }, } for _, provider := range providers { if provider.Enabled() { t.Errorf("Provider %s is unexpectedly enabled", reflect.TypeOf(provider).String()) } } }
func (c *EtcdConfig) newHttpTransport() (*http.Transport, error) { info := transport.TLSInfo{ CertFile: c.CertFile, KeyFile: c.KeyFile, CAFile: c.CAFile, } cfg, err := info.ClientConfig() if err != nil { return nil, err } // Copied from etcd.DefaultTransport declaration. // TODO: Determine if transport needs optimization tr := utilnet.SetTransportDefaults(&http.Transport{ Proxy: http.ProxyFromEnvironment, Dial: (&net.Dialer{ Timeout: 30 * time.Second, KeepAlive: 30 * time.Second, }).Dial, TLSHandshakeTimeout: 10 * time.Second, MaxIdleConnsPerHost: 500, TLSClientConfig: cfg, }) return tr, nil }
// MakeEtcdClient creates an etcd client based on the provided config. func MakeEtcdClient(etcdClientInfo configapi.EtcdConnectionInfo) (etcdclient.Client, error) { tlsConfig, err := restclient.TLSConfigFor(&restclient.Config{ TLSClientConfig: restclient.TLSClientConfig{ CertFile: etcdClientInfo.ClientCert.CertFile, KeyFile: etcdClientInfo.ClientCert.KeyFile, CAFile: etcdClientInfo.CA, }, }) if err != nil { return nil, err } transport := knet.SetTransportDefaults(&http.Transport{ TLSClientConfig: tlsConfig, Dial: (&net.Dialer{ // default from http.DefaultTransport Timeout: 30 * time.Second, // Lower the keep alive for connections. KeepAlive: 1 * time.Second, }).Dial, // Because watches are very bursty, defends against long delays in watch reconnections. MaxIdleConnsPerHost: 500, }) cfg := etcdclient.Config{ Endpoints: etcdClientInfo.URLs, // TODO: Determine if transport needs optimization Transport: transport, } return etcdclient.New(cfg) }
// init registers the various means by which credentials may // be resolved on GCP. func init() { tr := utilnet.SetTransportDefaults(&http.Transport{}) metadataHTTPClientTimeout := time.Second * 10 httpClient := &http.Client{ Transport: tr, Timeout: metadataHTTPClientTimeout, } credentialprovider.RegisterCredentialProvider("google-dockercfg", &credentialprovider.CachingDockerConfigProvider{ Provider: &dockerConfigKeyProvider{ metadataProvider{Client: httpClient}, }, Lifetime: 60 * time.Second, }) credentialprovider.RegisterCredentialProvider("google-dockercfg-url", &credentialprovider.CachingDockerConfigProvider{ Provider: &dockerConfigUrlKeyProvider{ metadataProvider{Client: httpClient}, }, Lifetime: 60 * time.Second, }) credentialprovider.RegisterCredentialProvider("google-container-registry", // Never cache this. The access token is already // cached by the metadata service. &containerRegistryProvider{ metadataProvider{Client: httpClient}, }) }
func tryAccessURL(t *testing.T, url string, expectedStatus int, expectedRedirectLocation string) *http.Response { transport := knet.SetTransportDefaults(&http.Transport{ TLSClientConfig: &tls.Config{ InsecureSkipVerify: true, }, }) req, err := http.NewRequest("GET", url, nil) req.Header.Set("Accept", "text/html") resp, err := transport.RoundTrip(req) if err != nil { t.Errorf("Unexpected error while accessing %q: %v", url, err) return nil } if resp.StatusCode != expectedStatus { t.Errorf("Expected status %d for %q, got %d", expectedStatus, url, resp.StatusCode) } // ignore query parameters location := resp.Header.Get("Location") location = strings.SplitN(location, "?", 2)[0] if location != expectedRedirectLocation { t.Errorf("Expected redirecttion to %q for %q, got %q instead", expectedRedirectLocation, url, location) } return resp }
// TransportFor returns an http.Transport for the given ca and client cert (which may be empty strings) func TransportFor(ca string, certFile string, keyFile string) (http.RoundTripper, error) { if len(ca) == 0 && len(certFile) == 0 && len(keyFile) == 0 { return http.DefaultTransport, nil } if (len(certFile) == 0) != (len(keyFile) == 0) { return nil, errors.New("certFile and keyFile must be specified together") } // Copy default transport transport := knet.SetTransportDefaults(&http.Transport{ TLSClientConfig: &tls.Config{}, }) if len(ca) != 0 { roots, err := CertPoolFromFile(ca) if err != nil { return nil, fmt.Errorf("error loading cert pool from ca file %s: %v", ca, err) } transport.TLSClientConfig.RootCAs = roots } if len(certFile) != 0 { cert, err := tls.LoadX509KeyPair(certFile, keyFile) if err != nil { return nil, fmt.Errorf("error loading x509 keypair from cert file %s and key file %s: %v", certFile, keyFile, err) } transport.TLSClientConfig.Certificates = []tls.Certificate{cert} } return transport, nil }
// New returns a new instance of GenericAPIServer from the given config. // Certain config fields will be set to a default value if unset, // including: // ServiceClusterIPRange // ServiceNodePortRange // MasterCount // ReadWritePort // PublicAddress // Public fields: // Handler -- The returned GenericAPIServer has a field TopHandler which is an // http.Handler which handles all the endpoints provided by the GenericAPIServer, // including the API, the UI, and miscellaneous debugging endpoints. All // these are subject to authorization and authentication. // InsecureHandler -- an http.Handler which handles all the same // endpoints as Handler, but no authorization and authentication is done. // Public methods: // HandleWithAuth -- Allows caller to add an http.Handler for an endpoint // that uses the same authentication and authorization (if any is configured) // as the GenericAPIServer's built-in endpoints. // If the caller wants to add additional endpoints not using the GenericAPIServer's // auth, then the caller should create a handler for those endpoints, which delegates the // any unhandled paths to "Handler". func (c completedConfig) New() (*GenericAPIServer, error) { if c.Serializer == nil { return nil, fmt.Errorf("Genericapiserver.New() called with config.Serializer == nil") } s := &GenericAPIServer{ ServiceClusterIPRange: c.ServiceClusterIPRange, ServiceNodePortRange: c.ServiceNodePortRange, LoopbackClientConfig: c.LoopbackClientConfig, legacyAPIPrefix: c.APIPrefix, apiPrefix: c.APIGroupPrefix, admissionControl: c.AdmissionControl, requestContextMapper: c.RequestContextMapper, Serializer: c.Serializer, minRequestTimeout: time.Duration(c.MinRequestTimeout) * time.Second, enableSwaggerSupport: c.EnableSwaggerSupport, MasterCount: c.MasterCount, SecureServingInfo: c.SecureServingInfo, InsecureServingInfo: c.InsecureServingInfo, ExternalAddress: c.ExternalHost, ClusterIP: c.PublicAddress, PublicReadWritePort: c.ReadWritePort, ServiceReadWriteIP: c.ServiceReadWriteIP, ServiceReadWritePort: c.ServiceReadWritePort, ExtraServicePorts: c.ExtraServicePorts, ExtraEndpointPorts: c.ExtraEndpointPorts, KubernetesServiceNodePort: c.KubernetesServiceNodePort, apiGroupsForDiscovery: map[string]unversioned.APIGroup{}, enableOpenAPISupport: c.EnableOpenAPISupport, openAPIInfo: c.OpenAPIInfo, openAPIDefaultResponse: c.OpenAPIDefaultResponse, openAPIDefinitions: c.OpenAPIDefinitions, } if c.RestfulContainer != nil { s.HandlerContainer = c.RestfulContainer } else { s.HandlerContainer = NewHandlerContainer(http.NewServeMux(), c.Serializer) } // Use CurlyRouter to be able to use regular expressions in paths. Regular expressions are required in paths for example for proxy (where the path is proxy/{kind}/{name}/{*}) s.HandlerContainer.Router(restful.CurlyRouter{}) s.Mux = apiserver.NewPathRecorderMux(s.HandlerContainer.ServeMux) apiserver.InstallServiceErrorHandler(s.Serializer, s.HandlerContainer) if c.ProxyDialer != nil || c.ProxyTLSClientConfig != nil { s.ProxyTransport = utilnet.SetTransportDefaults(&http.Transport{ Dial: c.ProxyDialer, TLSClientConfig: c.ProxyTLSClientConfig, }) } s.installAPI(c.Config) s.Handler, s.InsecureHandler = s.buildHandlerChains(c.Config, http.Handler(s.Mux.BaseMux().(*http.ServeMux))) return s, nil }
func getURL(url string) (resp *http.Response, err error) { tr := knet.SetTransportDefaults(&http.Transport{}) req, err := http.NewRequest("GET", url, nil) if err != nil { return nil, err } return tr.RoundTrip(req) }
func postForm(url string, body url.Values) (resp *http.Response, err error) { tr := knet.SetTransportDefaults(&http.Transport{}) req, err := http.NewRequest("POST", url, strings.NewReader(body.Encode())) if err != nil { return nil, err } req.Header.Set("Content-Type", "application/x-www-form-urlencoded") return tr.RoundTrip(req) }
func insecureTransport() *http.Transport { return knet.SetTransportDefaults(&http.Transport{ TLSClientConfig: &tls.Config{ // Change default from SSLv3 to TLSv1.0 (because of POODLE vulnerability) MinVersion: tls.VersionTLS10, InsecureSkipVerify: true, }, }) }
func (d PodCheckAuth) authenticateToRegistry(token string, r types.DiagnosticResult) { resolvConf, err := getResolvConf(r) if err != nil { return // any errors have been reported via "r", env is very borked, test cannot proceed } msg := new(dns.Msg) msg.SetQuestion(registryHostname+".", dns.TypeA) msg.RecursionDesired = false result, completed := dnsQueryWithTimeout(msg, resolvConf.Servers[0], 2) switch { case !completed: r.Error("DP1006", nil, fmt.Sprintf("DNS resolution for registry address %s timed out; this could indicate problems with DNS resolution or networking", registryHostname)) return case result.err != nil: r.Error("DP1016", nil, fmt.Sprintf("DNS resolution for registry address %s returned an error; container DNS is likely incorrect. The error was: %v", registryHostname, result.err)) return case result.in == nil, len(result.in.Answer) == 0: r.Warn("DP1007", nil, fmt.Sprintf("DNS resolution for registry address %s returned no results; either the integrated registry is not deployed, or container DNS configuration is incorrect.", registryHostname)) return } // first try the secure connection in case they followed directions to secure the registry // (https://docs.openshift.org/latest/install_config/install/docker_registry.html#securing-the-registry) cacert, err := ioutil.ReadFile(d.MasterCaPath) // TODO: we assume same CA as master - better choice? if err != nil { r.Error("DP1008", err, fmt.Sprintf("Failed to read CA cert file %s:\n%v", d.MasterCaPath, err)) return } pool := x509.NewCertPool() if !pool.AppendCertsFromPEM(cacert) { r.Error("DP1009", err, fmt.Sprintf("Could not use cert from CA cert file %s:\n%v", d.MasterCaPath, err)) return } noSecClient := http.Client{ CheckRedirect: func(req *http.Request, via []*http.Request) error { return fmt.Errorf("no redirect expected") }, Timeout: time.Second * 2, } secClient := noSecClient secClient.Transport = knet.SetTransportDefaults(&http.Transport{TLSClientConfig: &tls.Config{RootCAs: pool}}) secError := processRegistryRequest(&secClient, fmt.Sprintf("https://%s:%s/v2/", registryHostname, registryPort), token, r) if secError == nil { return // made the request successfully enough to diagnose } switch { case strings.Contains(secError.Error(), "tls: oversized record received"), strings.Contains(secError.Error(), "server gave HTTP response to HTTPS"): r.Debug("DP1015", "docker-registry not secured; falling back to cleartext connection") if nosecError := processRegistryRequest(&noSecClient, fmt.Sprintf("http://%s:%s/v2/", registryHostname, registryPort), token, r); nosecError != nil { r.Error("DP1013", nosecError, fmt.Sprintf("Unexpected error authenticating to the integrated registry:\n(%T) %[1]v", nosecError)) } default: r.Error("DP1013", secError, fmt.Sprintf("Unexpected error authenticating to the integrated registry:\n(%T) %[1]v", secError)) } }
func TestRootRedirect(t *testing.T) { testutil.RequireEtcd(t) defer testutil.DumpEtcdOnFailure(t) masterConfig, _, err := testserver.StartTestMasterAPI() if err != nil { t.Fatalf("unexpected error: %v", err) } transport := knet.SetTransportDefaults(&http.Transport{ TLSClientConfig: &tls.Config{ InsecureSkipVerify: true, }, }) req, err := http.NewRequest("GET", masterConfig.AssetConfig.MasterPublicURL, nil) req.Header.Set("Accept", "*/*") resp, err := transport.RoundTrip(req) if err != nil { t.Fatalf("Unexpected error: %v", err) } if resp.StatusCode != http.StatusOK { t.Fatalf("Expected %d, got %d", http.StatusOK, resp.StatusCode) } if resp.Header.Get("Content-Type") != "application/json" { t.Fatalf("Expected %s, got %s", "application/json", resp.Header.Get("Content-Type")) } type result struct { Paths []string } body, err := ioutil.ReadAll(resp.Body) if err != nil { t.Fatalf("Unexpected error reading the body: %v", err) } var got result json.Unmarshal(body, &got) sort.Strings(got.Paths) if !reflect.DeepEqual(got.Paths, expectedIndex) { t.Fatalf("Unexpected index: got=%v, expected=%v", got, expectedIndex) } req, err = http.NewRequest("GET", masterConfig.AssetConfig.MasterPublicURL, nil) req.Header.Set("Accept", "text/html") resp, err = transport.RoundTrip(req) if err != nil { t.Errorf("Unexpected error: %v", err) } if resp.StatusCode != http.StatusFound { t.Errorf("Expected %d, got %d", http.StatusFound, resp.StatusCode) } if resp.Header.Get("Location") != masterConfig.AssetConfig.PublicURL { t.Errorf("Expected %s, got %s", masterConfig.AssetConfig.PublicURL, resp.Header.Get("Location")) } // TODO add a test for when asset config is nil, the redirect should not occur in this case even when // accept header contains text/html }
func (l *SSHTunnelList) healthCheck(e sshTunnelEntry) error { // GET the healthcheck path using the provided tunnel's dial function. transport := utilnet.SetTransportDefaults(&http.Transport{ Dial: e.Tunnel.Dial, // TODO(cjcullen): Plumb real TLS options through. TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, }) client := &http.Client{Transport: transport} _, err := client.Get(l.healthCheckURL.String()) return err }
func newMesosClient( md detector.Master, mesosHttpClientTimeout, stateCacheTTL time.Duration) (*mesosClient, error) { tr := utilnet.SetTransportDefaults(&http.Transport{}) httpClient := &http.Client{ Transport: tr, Timeout: mesosHttpClientTimeout, } return createMesosClient(md, httpClient, tr, stateCacheTTL) }
// New returns a new instance of GenericAPIServer from the given config. // Certain config fields will be set to a default value if unset, // including: // ServiceClusterIPRange // ServiceNodePortRange // MasterCount // ReadWritePort // PublicAddress // Public fields: // Handler -- The returned GenericAPIServer has a field TopHandler which is an // http.Handler which handles all the endpoints provided by the GenericAPIServer, // including the API, the UI, and miscellaneous debugging endpoints. All // these are subject to authorization and authentication. // InsecureHandler -- an http.Handler which handles all the same // endpoints as Handler, but no authorization and authentication is done. // Public methods: // HandleWithAuth -- Allows caller to add an http.Handler for an endpoint // that uses the same authentication and authorization (if any is configured) // as the GenericAPIServer's built-in endpoints. // If the caller wants to add additional endpoints not using the GenericAPIServer's // auth, then the caller should create a handler for those endpoints, which delegates the // any unhandled paths to "Handler". func (c completedConfig) New() (*GenericAPIServer, error) { if c.Serializer == nil { return nil, fmt.Errorf("Genericapiserver.New() called with config.Serializer == nil") } s := &GenericAPIServer{ ServiceClusterIPRange: c.ServiceClusterIPRange, ServiceNodePortRange: c.ServiceNodePortRange, LoopbackClientConfig: c.LoopbackClientConfig, legacyAPIPrefix: c.APIPrefix, apiPrefix: c.APIGroupPrefix, admissionControl: c.AdmissionControl, requestContextMapper: c.RequestContextMapper, Serializer: c.Serializer, minRequestTimeout: time.Duration(c.MinRequestTimeout) * time.Second, enableSwaggerSupport: c.EnableSwaggerSupport, MasterCount: c.MasterCount, SecureServingInfo: c.SecureServingInfo, InsecureServingInfo: c.InsecureServingInfo, ExternalAddress: c.ExternalHost, ClusterIP: c.PublicAddress, PublicReadWritePort: c.ReadWritePort, ServiceReadWriteIP: c.ServiceReadWriteIP, ServiceReadWritePort: c.ServiceReadWritePort, ExtraServicePorts: c.ExtraServicePorts, ExtraEndpointPorts: c.ExtraEndpointPorts, KubernetesServiceNodePort: c.KubernetesServiceNodePort, apiGroupsForDiscovery: map[string]unversioned.APIGroup{}, enableOpenAPISupport: c.EnableOpenAPISupport, openAPIInfo: c.OpenAPIInfo, openAPIDefaultResponse: c.OpenAPIDefaultResponse, openAPIDefinitions: c.OpenAPIDefinitions, } s.HandlerContainer = mux.NewAPIContainer(http.NewServeMux(), c.Serializer) if c.ProxyDialer != nil || c.ProxyTLSClientConfig != nil { s.ProxyTransport = utilnet.SetTransportDefaults(&http.Transport{ Dial: c.ProxyDialer, TLSClientConfig: c.ProxyTLSClientConfig, }) } s.installAPI(c.Config) s.Handler, s.InsecureHandler = c.BuildHandlerChainsFunc(s.HandlerContainer.ServeMux, c.Config) return s, nil }
func makeTransport(config *schedulerapi.ExtenderConfig) (http.RoundTripper, error) { var cfg restclient.Config if config.TLSConfig != nil { cfg.TLSClientConfig = *config.TLSConfig } if config.EnableHttps { hasCA := len(cfg.CAFile) > 0 || len(cfg.CAData) > 0 if !hasCA { cfg.Insecure = true } } tlsConfig, err := restclient.TLSConfigFor(&cfg) if err != nil { return nil, err } if tlsConfig != nil { return utilnet.SetTransportDefaults(&http.Transport{ TLSClientConfig: tlsConfig, }), nil } return utilnet.SetTransportDefaults(&http.Transport{}), nil }
func createClients(numberOfClients int) ([]*clientset.Clientset, []*internalclientset.Clientset, error) { clients := make([]*clientset.Clientset, numberOfClients) internalClients := make([]*internalclientset.Clientset, numberOfClients) for i := 0; i < numberOfClients; i++ { config, err := framework.LoadConfig() Expect(err).NotTo(HaveOccurred()) config.QPS = 100 config.Burst = 200 if framework.TestContext.KubeAPIContentType != "" { config.ContentType = framework.TestContext.KubeAPIContentType } // For the purpose of this test, we want to force that clients // do not share underlying transport (which is a default behavior // in Kubernetes). Thus, we are explicitly creating transport for // each client here. transportConfig, err := config.TransportConfig() if err != nil { return nil, nil, err } tlsConfig, err := transport.TLSConfigFor(transportConfig) if err != nil { return nil, nil, err } config.Transport = utilnet.SetTransportDefaults(&http.Transport{ Proxy: http.ProxyFromEnvironment, TLSHandshakeTimeout: 10 * time.Second, TLSClientConfig: tlsConfig, MaxIdleConnsPerHost: 100, Dial: (&net.Dialer{ Timeout: 30 * time.Second, KeepAlive: 30 * time.Second, }).Dial, }) // Overwrite TLS-related fields from config to avoid collision with // Transport field. config.TLSClientConfig = restclient.TLSClientConfig{} c, err := clientset.NewForConfig(config) if err != nil { return nil, nil, err } clients[i] = c internalClient, err := internalclientset.NewForConfig(config) if err != nil { return nil, nil, err } internalClients[i] = internalClient } return clients, internalClients, nil }
// New creates a token authenticator which validates OpenID Connect ID Tokens. func New(opts OIDCOptions) (*OIDCAuthenticator, error) { url, err := url.Parse(opts.IssuerURL) if err != nil { return nil, err } if url.Scheme != "https" { return nil, fmt.Errorf("'oidc-issuer-url' (%q) has invalid scheme (%q), require 'https'", opts.IssuerURL, url.Scheme) } if opts.UsernameClaim == "" { return nil, errors.New("no username claim provided") } var roots *x509.CertPool if opts.CAFile != "" { roots, err = crypto.CertPoolFromFile(opts.CAFile) if err != nil { return nil, fmt.Errorf("Failed to read the CA file: %v", err) } } else { glog.Info("OIDC: No x509 certificates provided, will use host's root CA set") } // Copied from http.DefaultTransport. tr := net.SetTransportDefaults(&http.Transport{ // According to golang's doc, if RootCAs is nil, // TLS uses the host's root CA set. TLSClientConfig: &tls.Config{RootCAs: roots}, }) authenticator := &OIDCAuthenticator{ issuerURL: opts.IssuerURL, trustedClientID: opts.ClientID, usernameClaim: opts.UsernameClaim, groupsClaim: opts.GroupsClaim, httpClient: &http.Client{Transport: tr}, } // Attempt to initialize the authenticator asynchronously. // // Ignore errors instead of returning it since the OpenID Connect provider might not be // available yet, for instance if it's running on the cluster and needs the API server // to come up first. Errors will be logged within the client() method. go func() { defer runtime.HandleCrash() authenticator.client() }() return authenticator, nil }
// newConnection creates a new connection func newConnection(url url.URL, dialTimeout time.Duration, allowInsecure, enableV2 bool) *connection { var isV2 *bool if !enableV2 { v2 := false isV2 = &v2 } var rt http.RoundTripper if allowInsecure { rt = knet.SetTransportDefaults(&http.Transport{ Dial: (&net.Dialer{ Timeout: dialTimeout, KeepAlive: 30 * time.Second, }).Dial, TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, }) } else { rt = knet.SetTransportDefaults(&http.Transport{ Dial: (&net.Dialer{ Timeout: dialTimeout, KeepAlive: 30 * time.Second, }).Dial, }) } rt = transport.DebugWrappers(rt) jar, _ := cookiejar.New(nil) client := &http.Client{Jar: jar, Transport: rt} return &connection{ url: url, client: client, cached: make(map[string]repository), isV2: isV2, allowInsecure: allowInsecure, } }
func dialHTTP(request, hostPort string) (string, error) { transport := utilnet.SetTransportDefaults(&http.Transport{}) httpClient := createHTTPClient(transport) resp, err := httpClient.Get(fmt.Sprintf("http://%s/%s", hostPort, request)) defer transport.CloseIdleConnections() if err == nil { defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err == nil { return string(body), nil } } return "", err }
// buildTransport creates a transport for use in executing HTTPS requests with // the given certs. Note that the given rootCA must be configured with isCA=true. func buildTransport(serverName string, rootCA []byte) (*http.Transport, error) { pool := x509.NewCertPool() ok := pool.AppendCertsFromPEM(rootCA) if !ok { return nil, fmt.Errorf("Unable to load serverCA.") } return utilnet.SetTransportDefaults(&http.Transport{ TLSClientConfig: &tls.Config{ InsecureSkipVerify: false, ServerName: serverName, RootCAs: pool, }, }), nil }
func MakeTransport(config *KubeletClientConfig) (http.RoundTripper, error) { tlsConfig, err := transport.TLSConfigFor(config.transportConfig()) if err != nil { return nil, err } rt := http.DefaultTransport if config.Dial != nil || tlsConfig != nil { rt = utilnet.SetTransportDefaults(&http.Transport{ Dial: config.Dial, TLSClientConfig: tlsConfig, }) } return transport.HTTPWrappersForConfig(config.transportConfig(), rt) }
func (l *SSHTunnelList) healthCheck(e sshTunnelEntry) error { // GET the healthcheck path using the provided tunnel's dial function. transport := utilnet.SetTransportDefaults(&http.Transport{ Dial: e.Tunnel.Dial, // TODO(cjcullen): Plumb real TLS options through. TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, // We don't reuse the clients, so disable the keep-alive to properly // close the connection. DisableKeepAlives: true, }) client := &http.Client{Transport: transport} resp, err := client.Get(l.healthCheckURL.String()) if err != nil { return err } resp.Body.Close() return nil }
// setUp is a convience function for setting up for (most) tests. func setUp(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *assert.Assertions) { server, storageConfig := etcdtesting.NewUnsecuredEtcd3TestClientServer(t) config := &Config{ GenericConfig: genericapiserver.NewConfig(), APIServerServicePort: 443, MasterCount: 1, } resourceEncoding := genericapiserver.NewDefaultResourceEncodingConfig() resourceEncoding.SetVersionEncoding(api.GroupName, registered.GroupOrDie(api.GroupName).GroupVersion, unversioned.GroupVersion{Group: api.GroupName, Version: runtime.APIVersionInternal}) resourceEncoding.SetVersionEncoding(autoscaling.GroupName, *testapi.Autoscaling.GroupVersion(), unversioned.GroupVersion{Group: autoscaling.GroupName, Version: runtime.APIVersionInternal}) resourceEncoding.SetVersionEncoding(batch.GroupName, *testapi.Batch.GroupVersion(), unversioned.GroupVersion{Group: batch.GroupName, Version: runtime.APIVersionInternal}) resourceEncoding.SetVersionEncoding(apps.GroupName, *testapi.Apps.GroupVersion(), unversioned.GroupVersion{Group: apps.GroupName, Version: runtime.APIVersionInternal}) resourceEncoding.SetVersionEncoding(extensions.GroupName, *testapi.Extensions.GroupVersion(), unversioned.GroupVersion{Group: extensions.GroupName, Version: runtime.APIVersionInternal}) resourceEncoding.SetVersionEncoding(rbac.GroupName, *testapi.Rbac.GroupVersion(), unversioned.GroupVersion{Group: rbac.GroupName, Version: runtime.APIVersionInternal}) resourceEncoding.SetVersionEncoding(certificates.GroupName, *testapi.Certificates.GroupVersion(), unversioned.GroupVersion{Group: certificates.GroupName, Version: runtime.APIVersionInternal}) storageFactory := genericapiserver.NewDefaultStorageFactory(*storageConfig, testapi.StorageMediaType(), api.Codecs, resourceEncoding, DefaultAPIResourceConfigSource()) kubeVersion := version.Get() config.GenericConfig.Version = &kubeVersion config.StorageFactory = storageFactory config.GenericConfig.LoopbackClientConfig = &restclient.Config{APIPath: "/api", ContentConfig: restclient.ContentConfig{NegotiatedSerializer: api.Codecs}} config.GenericConfig.APIResourceConfigSource = DefaultAPIResourceConfigSource() config.GenericConfig.PublicAddress = net.ParseIP("192.168.10.4") config.GenericConfig.LegacyAPIGroupPrefixes = sets.NewString("/api") config.GenericConfig.APIResourceConfigSource = DefaultAPIResourceConfigSource() config.GenericConfig.RequestContextMapper = api.NewRequestContextMapper() config.GenericConfig.LoopbackClientConfig = &restclient.Config{APIPath: "/api", ContentConfig: restclient.ContentConfig{NegotiatedSerializer: api.Codecs}} config.GenericConfig.EnableMetrics = true config.EnableCoreControllers = false config.KubeletClientConfig = kubeletclient.KubeletClientConfig{Port: 10250} config.ProxyTransport = utilnet.SetTransportDefaults(&http.Transport{ Dial: func(network, addr string) (net.Conn, error) { return nil, nil }, TLSClientConfig: &tls.Config{}, }) master, err := config.Complete().New() if err != nil { t.Fatal(err) } return master, server, *config, assert.New(t) }
func TestContainerRegistryNoStorageScope(t *testing.T) { const ( serviceAccountsEndpoint = "/computeMetadata/v1/instance/service-accounts/" defaultEndpoint = "/computeMetadata/v1/instance/service-accounts/default/" scopeEndpoint = defaultEndpoint + "scopes" ) server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // Only serve the URL key and the value endpoint if scopeEndpoint == r.URL.Path { w.WriteHeader(http.StatusOK) w.Header().Set("Content-Type", "application/json") fmt.Fprint(w, `["https://www.googleapis.com/auth/compute.read_write"]`) } else if serviceAccountsEndpoint == r.URL.Path { w.WriteHeader(http.StatusOK) fmt.Fprintln(w, "default/\ncustom") } else { w.WriteHeader(http.StatusNotFound) } })) defer server.Close() var err error gceProductNameFile, err = createProductNameFile() if err != nil { t.Errorf("failed to create gce product name file: %v", err) } defer os.Remove(gceProductNameFile) // Make a transport that reroutes all traffic to the example server transport := utilnet.SetTransportDefaults(&http.Transport{ Proxy: func(req *http.Request) (*url.URL, error) { return url.Parse(server.URL + req.URL.Path) }, }) provider := &containerRegistryProvider{ metadataProvider{Client: &http.Client{Transport: transport}}, } if provider.Enabled() { t.Errorf("Provider is unexpectedly enabled") } }
func (config *KubeProxyTestConfig) hitLoadBalancer(epCount int) { lbIP := config.loadBalancerService.Status.LoadBalancer.Ingress[0].IP hostNames := make(map[string]bool) tries := epCount*epCount + 5 for i := 0; i < tries; i++ { transport := utilnet.SetTransportDefaults(&http.Transport{}) httpClient := createHTTPClient(transport) resp, err := httpClient.Get(fmt.Sprintf("http://%s:%d/hostName", lbIP, loadBalancerHttpPort)) if err == nil { defer resp.Body.Close() hostName, err := ioutil.ReadAll(resp.Body) if err == nil { hostNames[string(hostName)] = true } } transport.CloseIdleConnections() } Expect(len(hostNames)).To(BeNumerically("==", epCount), "LoadBalancer did not hit all pods") }
func tryAccessURL(t *testing.T, url string, expectedStatus int, expectedRedirectLocation string, expectedLinks []string) *http.Response { transport := knet.SetTransportDefaults(&http.Transport{ TLSClientConfig: &tls.Config{ InsecureSkipVerify: true, }, }) req, err := http.NewRequest("GET", url, nil) req.Header.Set("Accept", "text/html") resp, err := transport.RoundTrip(req) if err != nil { t.Errorf("Unexpected error while accessing %q: %v", url, err) return nil } if resp.StatusCode != expectedStatus { t.Errorf("Expected status %d for %q, got %d", expectedStatus, url, resp.StatusCode) } // ignore query parameters location := resp.Header.Get("Location") location = strings.SplitN(location, "?", 2)[0] if location != expectedRedirectLocation { t.Errorf("Expected redirection to %q for %q, got %q instead", expectedRedirectLocation, url, location) } if expectedLinks != nil { body, err := ioutil.ReadAll(resp.Body) if err != nil { t.Errorf("failed to read reposponse's body: %v", err) } else { for _, linkRegexp := range expectedLinks { matched, err := regexp.Match(linkRegexp, body) if err != nil { t.Errorf("unexpected error: %v", err) } else if !matched { t.Errorf("Expected response body to match %s", linkRegexp) t.Logf("Response body was %s", body) } } } } return resp }
func TestRootRedirect(t *testing.T) { testutil.RequireEtcd(t) masterConfig, _, err := testserver.StartTestMasterAPI() if err != nil { t.Fatalf("unexpected error: %v", err) } transport := knet.SetTransportDefaults(&http.Transport{ TLSClientConfig: &tls.Config{ InsecureSkipVerify: true, }, }) req, err := http.NewRequest("GET", masterConfig.AssetConfig.MasterPublicURL, nil) req.Header.Set("Accept", "*/*") resp, err := transport.RoundTrip(req) if err != nil { t.Errorf("Unexpected error: %v", err) } if resp.StatusCode != http.StatusOK { t.Errorf("Expected %d, got %d", http.StatusOK, resp.StatusCode) } if resp.Header.Get("Content-Type") != "application/json" { t.Errorf("Expected %s, got %s", "application/json", resp.Header.Get("Content-Type")) } req, err = http.NewRequest("GET", masterConfig.AssetConfig.MasterPublicURL, nil) req.Header.Set("Accept", "text/html") resp, err = transport.RoundTrip(req) if err != nil { t.Errorf("Unexpected error: %v", err) } if resp.StatusCode != http.StatusFound { t.Errorf("Expected %d, got %d", http.StatusFound, resp.StatusCode) } if resp.Header.Get("Location") != masterConfig.AssetConfig.PublicURL { t.Errorf("Expected %s, got %s", masterConfig.AssetConfig.PublicURL, resp.Header.Get("Location")) } // TODO add a test for when asset config is nil, the redirect should not occur in this case even when // accept header contains text/html }