Skip to content

Commit

Permalink
scheduler: Use schedulable masters if no compute hosts defined.
Browse files Browse the repository at this point in the history
This change makes use of a new configuration item on the scheduler CR
that specifies that control plane hosts should be able to run
workloads.  This option is off by default, but will now be turned on
if there are no compute machine pools with non-zero replicas defined.

This change also removes a validation and warning when no compute
hosts are defined, as an install with this configuration will now
complete successfully.
  • Loading branch information
russellb committed Jul 22, 2019
1 parent 1392583 commit 64f96df
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 9 deletions.
26 changes: 25 additions & 1 deletion pkg/asset/manifests/scheduler.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@ import (

"github.com/ghodss/yaml"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"

configv1 "github.com/openshift/api/config/v1"
"github.com/openshift/installer/pkg/asset"
"github.com/openshift/installer/pkg/asset/installconfig"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

Expand All @@ -30,7 +32,9 @@ func (*Scheduler) Name() string {
// Dependencies returns all of the dependencies directly needed to generate
// the asset.
func (*Scheduler) Dependencies() []asset.Asset {
return []asset.Asset{}
return []asset.Asset{
&installconfig.InstallConfig{},
}
}

// Generate generates the scheduler config and its CRD.
Expand All @@ -49,6 +53,26 @@ func (s *Scheduler) Generate(dependencies asset.Parents) error {
},
}

installConfig := &installconfig.InstallConfig{}
dependencies.Get(installConfig)
computeReplicas := int64(0)
for _, pool := range installConfig.Config.Compute {
if pool.Replicas != nil {
computeReplicas += *pool.Replicas
}
}
if computeReplicas == 0 {
// A schedulable host is required for a successful install to complete.
// If the install config has 0 replicas for compute hosts, it's one of two cases:
// 1. An IPI deployment with no compute hosts. The deployment can not succeed
// without MastersSchedulable = true.
// 2. A UPI deployment. The deployment may add compute hosts, but to ensure the
// the highest probability of a successful deployment, we default to
// schedulable masters.
logrus.Warningf("Making control-plane schedulable by setting MastersSchedulabe to true for Scheduler cluster settings")
config.Spec.MastersSchedulable = true
}

configData, err := yaml.Marshal(config)
if err != nil {
return errors.Wrapf(err, "failed to create %s manifests from InstallConfig", s.Name())
Expand Down
8 changes: 0 additions & 8 deletions pkg/types/validation/installconfig.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (

dockerref "github.com/containers/image/docker/reference"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"k8s.io/apimachinery/pkg/util/validation/field"

"github.com/openshift/installer/pkg/types"
Expand Down Expand Up @@ -183,7 +182,6 @@ func validateControlPlane(platform *types.Platform, pool *types.MachinePool, fld
func validateCompute(platform *types.Platform, pools []types.MachinePool, fldPath *field.Path) field.ErrorList {
allErrs := field.ErrorList{}
poolNames := map[string]bool{}
foundPositiveReplicas := false
for i, p := range pools {
poolFldPath := fldPath.Index(i)
if p.Name != "worker" {
Expand All @@ -193,14 +191,8 @@ func validateCompute(platform *types.Platform, pools []types.MachinePool, fldPat
allErrs = append(allErrs, field.Duplicate(poolFldPath.Child("name"), p.Name))
}
poolNames[p.Name] = true
if p.Replicas != nil && *p.Replicas > 0 {
foundPositiveReplicas = true
}
allErrs = append(allErrs, ValidateMachinePool(platform, &p, poolFldPath)...)
}
if !foundPositiveReplicas {
logrus.Warnf("There are no compute nodes specified. The cluster will not fully initialize without compute nodes.")
}
return allErrs
}

Expand Down

0 comments on commit 64f96df

Please sign in to comment.