Merge pull request #15267 from nikhiljindal/deploymentRCSelector

Deployment: Fixing the selector for new RC created by deployment
This commit is contained in:
Dawn Chen 2015-10-12 14:40:30 -07:00
commit 00eb2e7bfc
3 changed files with 37 additions and 10 deletions

View File

@ -44,6 +44,19 @@ func addDefaultingFuncs() {
} }
}, },
func(obj *Deployment) { func(obj *Deployment) {
// Default labels and selector to labels from pod template spec.
var labels map[string]string
if obj.Spec.Template != nil {
labels = obj.Spec.Template.Labels
}
if labels != nil {
if len(obj.Spec.Selector) == 0 {
obj.Spec.Selector = labels
}
if len(obj.Labels) == 0 {
obj.Labels = labels
}
}
// Set DeploymentSpec.Replicas to 1 if it is not set. // Set DeploymentSpec.Replicas to 1 if it is not set.
if obj.Spec.Replicas == nil { if obj.Spec.Replicas == nil {
obj.Spec.Replicas = new(int) obj.Spec.Replicas = new(int)

View File

@ -140,6 +140,9 @@ func (d *DeploymentController) getNewRC(deployment extensions.Deployment) (*api.
podTemplateSpecHash := deploymentUtil.GetPodTemplateSpecHash(deployment.Spec.Template) podTemplateSpecHash := deploymentUtil.GetPodTemplateSpecHash(deployment.Spec.Template)
rcName := fmt.Sprintf("deploymentrc-%d", podTemplateSpecHash) rcName := fmt.Sprintf("deploymentrc-%d", podTemplateSpecHash)
newRCTemplate := deploymentUtil.GetNewRCTemplate(deployment) newRCTemplate := deploymentUtil.GetNewRCTemplate(deployment)
// Add podTemplateHash label to selector.
newRCSelector := deploymentUtil.CloneAndAddLabel(deployment.Spec.Selector, deployment.Spec.UniqueLabelKey, podTemplateSpecHash)
newRC := api.ReplicationController{ newRC := api.ReplicationController{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: rcName, Name: rcName,
@ -147,7 +150,7 @@ func (d *DeploymentController) getNewRC(deployment extensions.Deployment) (*api.
}, },
Spec: api.ReplicationControllerSpec{ Spec: api.ReplicationControllerSpec{
Replicas: 0, Replicas: 0,
Selector: newRCTemplate.ObjectMeta.Labels, Selector: newRCSelector,
Template: newRCTemplate, Template: newRCTemplate,
}, },
} }

View File

@ -90,18 +90,29 @@ func GetNewRCTemplate(deployment extensions.Deployment) *api.PodTemplateSpec {
ObjectMeta: deployment.Spec.Template.ObjectMeta, ObjectMeta: deployment.Spec.Template.ObjectMeta,
Spec: deployment.Spec.Template.Spec, Spec: deployment.Spec.Template.Spec,
} }
podTemplateSpecHash := GetPodTemplateSpecHash(newRCTemplate) newRCTemplate.ObjectMeta.Labels = CloneAndAddLabel(
if deployment.Spec.UniqueLabelKey != "" { deployment.Spec.Template.ObjectMeta.Labels,
newLabels := map[string]string{} deployment.Spec.UniqueLabelKey,
for key, value := range deployment.Spec.Template.ObjectMeta.Labels { GetPodTemplateSpecHash(newRCTemplate))
newLabels[key] = value
}
newLabels[deployment.Spec.UniqueLabelKey] = fmt.Sprintf("%d", podTemplateSpecHash)
newRCTemplate.ObjectMeta.Labels = newLabels
}
return newRCTemplate return newRCTemplate
} }
// Clones the given map and returns a new map with the given key and value added.
// Returns the given map, if labelKey is empty.
func CloneAndAddLabel(labels map[string]string, labelKey string, labelValue uint32) map[string]string {
if labelKey == "" {
// Dont need to add a label.
return labels
}
// Clone.
newLabels := map[string]string{}
for key, value := range labels {
newLabels[key] = value
}
newLabels[labelKey] = fmt.Sprintf("%d", labelValue)
return newLabels
}
func GetPodTemplateSpecHash(template *api.PodTemplateSpec) uint32 { func GetPodTemplateSpecHash(template *api.PodTemplateSpec) uint32 {
podTemplateSpecHasher := adler32.New() podTemplateSpecHasher := adler32.New()
util.DeepHashObject(podTemplateSpecHasher, template) util.DeepHashObject(podTemplateSpecHasher, template)