Merge remote-tracking branch 'origin/master' into release-1.13

pull/58/head
Yang Li 2018-11-26 11:13:34 +08:00
commit 759f12a711
6 changed files with 32 additions and 6 deletions

View File

@ -31,7 +31,7 @@ const APIServerExtraArgs = "apiserver-extra-args"
// CertificatesDir flag sets the path where to save and read the certificates.
const CertificatesDir = "cert-dir"
// CfgPath flag sets the path to kubeadm config file. WARNING: Usage of a configuration file is experimental.
// CfgPath flag sets the path to kubeadm config file.
const CfgPath = "config"
// ControllerManagerExtraArgs flag sets extra flags to pass to the Controller Manager or override default ones in form of <flagname>=<value>.

View File

@ -33,7 +33,7 @@ func AddKubeConfigDirFlag(fs *pflag.FlagSet, kubeConfigDir *string) {
// AddConfigFlag adds the --config flag to the given flagset
func AddConfigFlag(fs *pflag.FlagSet, cfgPath *string) {
fs.StringVar(cfgPath, CfgPath, *cfgPath, "Path to kubeadm config file (WARNING: Usage of a configuration file is experimental).")
fs.StringVar(cfgPath, CfgPath, *cfgPath, "Path to a kubeadm configuration file.")
}
// AddIgnorePreflightErrorsFlag adds the --ignore-preflight-errors flag to the given flagset

View File

@ -50,6 +50,7 @@ func NewMarkControlPlanePhase() workflow.Phase {
Example: markControlPlaneExample,
InheritFlags: []string{
options.NodeName,
options.CfgPath,
},
Run: runMarkControlPlane,
}

View File

@ -314,11 +314,14 @@ type RuntimeSorter struct {
}
func (r *RuntimeSorter) Sort() error {
if len(r.objects) <= 1 {
// a list is only considered "sorted" if there are 0 or 1 items in it
// AND (if 1 item) the item is not a Table object
// a list is only considered "sorted" if there are 0 or 1 items in it
// AND (if 1 item) the item is not a Table object
if len(r.objects) == 0 {
return nil
}
if len(r.objects) == 1 {
_, isTable := r.objects[0].(*metav1beta1.Table)
if len(r.objects) == 0 || !isTable {
if !isTable {
return nil
}
}

View File

@ -560,6 +560,15 @@ func TestRuntimeSorter(t *testing.T) {
expect string
expectError string
}{
{
name: "ensure sorter works with an empty object list",
field: "metadata.name",
objs: []runtime.Object{},
op: func(sorter *RuntimeSorter, objs []runtime.Object, out io.Writer) error {
return nil
},
expect: "",
},
{
name: "ensure sorter returns original position",
field: "metadata.name",

View File

@ -881,6 +881,19 @@ var _ = SIGDescribe("Cluster size autoscaling [Slow]", func() {
clusterSize = manuallyIncreaseClusterSize(f, originalSizes)
}
// If new nodes are disconnected too soon, they'll be considered not started
// instead of unready, and cluster won't be considered unhealthy.
//
// More precisely, Cluster Autoscaler compares last transition time of
// several readiness conditions to node create time. If it's within
// 2 minutes, it'll assume node is just starting and not unhealthy.
//
// Nodes become ready in less than 1 minute after being created,
// so waiting extra 2 minutes before breaking them (which triggers
// readiness condition transition) should be sufficient, while
// making no assumptions about minimal node startup time.
time.Sleep(2 * time.Minute)
By("Block network connectivity to some nodes to simulate unhealthy cluster")
nodesToBreakCount := int(math.Ceil(math.Max(float64(unhealthyClusterThreshold), 0.5*float64(clusterSize))))
nodes, err := f.ClientSet.CoreV1().Nodes().List(metav1.ListOptions{FieldSelector: fields.Set{