Expect(len(nodes.Items)).To(Equal(1)) var addr string for _, a := range nodes.Items[0].Status.Addresses { if a.Type == api.NodeInternalIP { addr = a.Address } } Expect(len(addr)).NotTo(Equal("")) }) It("starts static pods on every node in the mesos cluster", func() { client := framework.Client expectNoError(allNodesReady(client, util.ForeverTestTimeout), "all nodes ready") nodelist, err := client.Nodes().List(api.ListOptions{}) expectNoError(err, "nodes fetched from apiserver") const ns = "static-pods" numpods := len(nodelist.Items) expectNoError(waitForPodsRunningReady(ns, numpods, util.ForeverTestTimeout), fmt.Sprintf("number of static pods in namespace %s is %d", ns, numpods)) }) It("schedules pods annotated with roles on correct slaves", func() { // launch a pod to find a node which can launch a pod. We intentionally do // not just take the node list and choose the first of them. Depending on the // cluster and the scheduler it might be that a "normal" pod cannot be // scheduled onto it. By("Trying to launch a pod with a label to get a node which can launch it.") podName := "with-label"
Expect(len(nodes.Items)).To(Equal(1)) var addr string for _, a := range nodes.Items[0].Status.Addresses { if a.Type == api.NodeInternalIP { addr = a.Address } } Expect(len(addr)).NotTo(Equal("")) }) It("starts static pods on every node in the mesos cluster", func() { client := framework.Client expectNoError(allNodesReady(client, util.ForeverTestTimeout), "all nodes ready") nodelist, err := client.Nodes().List(unversioned.ListOptions{}) expectNoError(err, "nodes fetched from apiserver") const ns = "static-pods" numpods := len(nodelist.Items) expectNoError(waitForPodsRunningReady(ns, numpods, util.ForeverTestTimeout), fmt.Sprintf("number of static pods in namespace %s is %d", ns, numpods)) }) It("schedules pods labelled with roles on correct slaves", func() { // launch a pod to find a node which can launch a pod. We intentionally do // not just take the node list and choose the first of them. Depending on the // cluster and the scheduler it might be that a "normal" pod cannot be // scheduled onto it. By("Trying to launch a pod with a label to get a node which can launch it.") podName := "with-label"
// Run runs the specified ProxyServer. This should never exit (unless CleanupAndExit is set). func (s *ProxyServer) Run(_ []string) error { protocol := utiliptables.ProtocolIpv4 if s.BindAddress.To4() == nil { protocol = utiliptables.ProtocolIpv6 } // remove iptables rules and exit if s.CleanupAndExit { execer := exec.New() dbus := utildbus.New() ipt := utiliptables.New(execer, dbus, protocol) encounteredError := userspace.CleanupLeftovers(ipt) encounteredError = iptables.CleanupLeftovers(ipt) || encounteredError if encounteredError { return errors.New("Encountered an error while tearing down rules.") } return nil } // TODO(vmarmol): Use container config for this. oomAdjuster := oom.NewOomAdjuster() if err := oomAdjuster.ApplyOomScoreAdj(0, s.OOMScoreAdj); err != nil { glog.V(2).Info(err) } // Run in its own container. if err := util.RunInResourceContainer(s.ResourceContainer); err != nil { glog.Warningf("Failed to start in resource-only container %q: %v", s.ResourceContainer, err) } else { glog.V(2).Infof("Running in resource-only container %q", s.ResourceContainer) } // define api config source if s.Kubeconfig == "" && s.Master == "" { glog.Warningf("Neither --kubeconfig nor --master was specified. Using default API client. This might not work.") } // This creates a client, first loading any specified kubeconfig // file, and then overriding the Master flag, if non-empty. kubeconfig, err := clientcmd.NewNonInteractiveDeferredLoadingClientConfig( &clientcmd.ClientConfigLoadingRules{ExplicitPath: s.Kubeconfig}, &clientcmd.ConfigOverrides{ClusterInfo: clientcmdapi.Cluster{Server: s.Master}}).ClientConfig() if err != nil { return err } client, err := client.New(kubeconfig) if err != nil { glog.Fatalf("Invalid API configuration: %v", err) } // Add event recorder hostname := nodeutil.GetHostname(s.HostnameOverride) eventBroadcaster := record.NewBroadcaster() s.Recorder = eventBroadcaster.NewRecorder(api.EventSource{Component: "kube-proxy", Host: hostname}) eventBroadcaster.StartRecordingToSink(client.Events("")) s.nodeRef = &api.ObjectReference{ Kind: "Node", Name: hostname, UID: types.UID(hostname), Namespace: "", } serviceConfig := config.NewServiceConfig() endpointsConfig := config.NewEndpointsConfig() var proxier proxy.ProxyProvider var endpointsHandler config.EndpointsConfigHandler execer := exec.New() dbus := utildbus.New() ipt := utiliptables.New(execer, dbus, protocol) if !checkKnownProxyMode(s.ProxyMode) { glog.Fatalf("Unknown proxy-mode flag: %s", s.ProxyMode) } useIptablesProxy := false if mayTryIptablesProxy(s.ProxyMode, client.Nodes(), hostname) { var err error // guaranteed false on error, error only necessary for debugging useIptablesProxy, err = iptables.ShouldUseIptablesProxier() if err != nil { glog.Errorf("Can't determine whether to use iptables proxy, using userspace proxier: %v", err) } } if useIptablesProxy { glog.V(2).Info("Using iptables Proxier.") proxierIptables, err := iptables.NewProxier(ipt, execer, s.SyncPeriod, s.MasqueradeAll) if err != nil { glog.Fatalf("Unable to create proxier: %v", err) } proxier = proxierIptables endpointsHandler = proxierIptables // No turning back. Remove artifacts that might still exist from the userspace Proxier. glog.V(2).Info("Tearing down userspace rules. Errors here are acceptable.") userspace.CleanupLeftovers(ipt) } else { glog.V(2).Info("Using userspace Proxier.") // This is a proxy.LoadBalancer which NewProxier needs but has methods we don't need for // our config.EndpointsConfigHandler. loadBalancer := userspace.NewLoadBalancerRR() // set EndpointsConfigHandler to our loadBalancer endpointsHandler = loadBalancer proxierUserspace, err := userspace.NewProxier(loadBalancer, s.BindAddress, ipt, s.PortRange, s.SyncPeriod) if err != nil { glog.Fatalf("Unable to create proxier: %v", err) } proxier = proxierUserspace // Remove artifacts from the pure-iptables Proxier. glog.V(2).Info("Tearing down pure-iptables proxy rules. Errors here are acceptable.") iptables.CleanupLeftovers(ipt) } // Birth Cry after the birth is successful s.birthCry() // Wire proxier to handle changes to services serviceConfig.RegisterHandler(proxier) // And wire endpointsHandler to handle changes to endpoints to services endpointsConfig.RegisterHandler(endpointsHandler) // Note: RegisterHandler() calls need to happen before creation of Sources because sources // only notify on changes, and the initial update (on process start) may be lost if no handlers // are registered yet. config.NewSourceAPI( client, 30*time.Second, serviceConfig.Channel("api"), endpointsConfig.Channel("api"), ) if s.HealthzPort > 0 { go util.Until(func() { err := http.ListenAndServe(s.HealthzBindAddress.String()+":"+strconv.Itoa(s.HealthzPort), nil) if err != nil { glog.Errorf("Starting health server failed: %v", err) } }, 5*time.Second, util.NeverStop) } ipt.AddReloadFunc(proxier.Sync) // Just loop forever for now... proxier.SyncLoop() return nil }
Expect(len(nodes.Items)).To(Equal(1)) var addr string for _, a := range nodes.Items[0].Status.Addresses { if a.Type == api.NodeInternalIP { addr = a.Address } } Expect(len(addr)).NotTo(Equal("")) }) It("starts static pods on every node in the mesos cluster", func() { client := framework.Client expectNoError(allNodesReady(client, util.ForeverTestTimeout), "all nodes ready") nodelist, err := client.Nodes().List(labels.Everything(), fields.Everything(), unversioned.ListOptions{}) expectNoError(err, "nodes fetched from apiserver") const ns = "static-pods" numpods := len(nodelist.Items) expectNoError(waitForPodsRunningReady(ns, numpods, util.ForeverTestTimeout), fmt.Sprintf("number of static pods in namespace %s is %d", ns, numpods)) }) It("schedules pods labelled with roles on correct slaves", func() { // launch a pod to find a node which can launch a pod. We intentionally do // not just take the node list and choose the first of them. Depending on the // cluster and the scheduler it might be that a "normal" pod cannot be // scheduled onto it. By("Trying to launch a pod with a label to get a node which can launch it.") podName := "with-label"