fix: update init_containers (#518)
* fix: PATH expension in Makefile Signed-off-by: Stephane Tang <hi@stang.sh> * refact: pass list of containers to compareContainers() Signed-off-by: Stephane Tang <hi@stang.sh> * compare initContainers while comparing StatefulSet Fixes #517 Signed-off-by: Stephane Tang <hi@stang.sh> * refact: compareContainers() Signed-off-by: Stephane Tang <hi@stang.sh>
This commit is contained in:
		
							parent
							
								
									5f6abfb797
								
							
						
					
					
						commit
						edeb06d39c
					
				
							
								
								
									
										2
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										2
									
								
								Makefile
								
								
								
								
							|  | @ -35,7 +35,7 @@ ifdef CDP_PULL_REQUEST_NUMBER | ||||||
| endif | endif | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| PATH := $(GOPATH)/bin:$(PATH) | PATH := "$(GOPATH)/bin:$(PATH)" | ||||||
| SHELL := env PATH=$(PATH) $(SHELL) | SHELL := env PATH=$(PATH) $(SHELL) | ||||||
| 
 | 
 | ||||||
| default: local | default: local | ||||||
|  |  | ||||||
|  | @ -317,14 +317,10 @@ func (c *Cluster) compareStatefulSetWith(statefulSet *v1beta1.StatefulSet) *comp | ||||||
| 		match = false | 		match = false | ||||||
| 		reasons = append(reasons, "new statefulset's annotations doesn't match the current one") | 		reasons = append(reasons, "new statefulset's annotations doesn't match the current one") | ||||||
| 	} | 	} | ||||||
| 	if len(c.Statefulset.Spec.Template.Spec.Containers) != len(statefulSet.Spec.Template.Spec.Containers) { | 
 | ||||||
| 		needsRollUpdate = true | 	needsRollUpdate, reasons = c.compareContainers("initContainers", c.Statefulset.Spec.Template.Spec.InitContainers, statefulSet.Spec.Template.Spec.InitContainers, needsRollUpdate, reasons) | ||||||
| 		reasons = append(reasons, "new statefulset's container specification doesn't match the current one") | 	needsRollUpdate, reasons = c.compareContainers("containers", c.Statefulset.Spec.Template.Spec.Containers, statefulSet.Spec.Template.Spec.Containers, needsRollUpdate, reasons) | ||||||
| 	} else { | 
 | ||||||
| 		var containerReasons []string |  | ||||||
| 		needsRollUpdate, containerReasons = c.compareContainers(c.Statefulset, statefulSet) |  | ||||||
| 		reasons = append(reasons, containerReasons...) |  | ||||||
| 	} |  | ||||||
| 	if len(c.Statefulset.Spec.Template.Spec.Containers) == 0 { | 	if len(c.Statefulset.Spec.Template.Spec.Containers) == 0 { | ||||||
| 		c.logger.Warningf("statefulset %q has no container", util.NameFromMeta(c.Statefulset.ObjectMeta)) | 		c.logger.Warningf("statefulset %q has no container", util.NameFromMeta(c.Statefulset.ObjectMeta)) | ||||||
| 		return &compareStatefulsetResult{} | 		return &compareStatefulsetResult{} | ||||||
|  | @ -415,34 +411,37 @@ func newCheck(msg string, cond containerCondition) containerCheck { | ||||||
| 	return containerCheck{reason: msg, condition: cond} | 	return containerCheck{reason: msg, condition: cond} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // compareContainers: compare containers from two stateful sets
 | // compareContainers: compare two list of Containers
 | ||||||
| // and return:
 | // and return:
 | ||||||
| // * whether or not a rolling update is needed
 | // * whether or not a rolling update is needed
 | ||||||
| // * a list of reasons in a human readable format
 | // * a list of reasons in a human readable format
 | ||||||
| func (c *Cluster) compareContainers(setA, setB *v1beta1.StatefulSet) (bool, []string) { | 
 | ||||||
| 	reasons := make([]string, 0) | func (c *Cluster) compareContainers(description string, setA, setB []v1.Container, needsRollUpdate bool, reasons []string) (bool, []string) { | ||||||
| 	needsRollUpdate := false | 	if len(setA) != len(setB) { | ||||||
|  | 		return true, append(reasons, fmt.Sprintf("new statefulset %s's length does not match the current ones", description)) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	checks := []containerCheck{ | 	checks := []containerCheck{ | ||||||
| 		newCheck("new statefulset's container %s (index %d) name doesn't match the current one", | 		newCheck("new statefulset %s's %s (index %d) name doesn't match the current one", | ||||||
| 			func(a, b v1.Container) bool { return a.Name != b.Name }), | 			func(a, b v1.Container) bool { return a.Name != b.Name }), | ||||||
| 		newCheck("new statefulset's container %s (index %d) image doesn't match the current one", | 		newCheck("new statefulset %s's %s (index %d) image doesn't match the current one", | ||||||
| 			func(a, b v1.Container) bool { return a.Image != b.Image }), | 			func(a, b v1.Container) bool { return a.Image != b.Image }), | ||||||
| 		newCheck("new statefulset's container %s (index %d) ports don't match the current one", | 		newCheck("new statefulset %s's %s (index %d) ports don't match the current one", | ||||||
| 			func(a, b v1.Container) bool { return !reflect.DeepEqual(a.Ports, b.Ports) }), | 			func(a, b v1.Container) bool { return !reflect.DeepEqual(a.Ports, b.Ports) }), | ||||||
| 		newCheck("new statefulset's container %s (index %d) resources don't match the current ones", | 		newCheck("new statefulset %s's %s (index %d) resources don't match the current ones", | ||||||
| 			func(a, b v1.Container) bool { return !compareResources(&a.Resources, &b.Resources) }), | 			func(a, b v1.Container) bool { return !compareResources(&a.Resources, &b.Resources) }), | ||||||
| 		newCheck("new statefulset's container %s (index %d) environment doesn't match the current one", | 		newCheck("new statefulset %s's %s (index %d) environment doesn't match the current one", | ||||||
| 			func(a, b v1.Container) bool { return !reflect.DeepEqual(a.Env, b.Env) }), | 			func(a, b v1.Container) bool { return !reflect.DeepEqual(a.Env, b.Env) }), | ||||||
| 		newCheck("new statefulset's container %s (index %d) environment sources don't match the current one", | 		newCheck("new statefulset %s's %s (index %d) environment sources don't match the current one", | ||||||
| 			func(a, b v1.Container) bool { return !reflect.DeepEqual(a.EnvFrom, b.EnvFrom) }), | 			func(a, b v1.Container) bool { return !reflect.DeepEqual(a.EnvFrom, b.EnvFrom) }), | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	for index, containerA := range setA.Spec.Template.Spec.Containers { | 	for index, containerA := range setA { | ||||||
| 		containerB := setB.Spec.Template.Spec.Containers[index] | 		containerB := setB[index] | ||||||
| 		for _, check := range checks { | 		for _, check := range checks { | ||||||
| 			if check.condition(containerA, containerB) { | 			if check.condition(containerA, containerB) { | ||||||
| 				needsRollUpdate = true | 				needsRollUpdate = true | ||||||
| 				reasons = append(reasons, fmt.Sprintf(check.reason, containerA.Name, index)) | 				reasons = append(reasons, fmt.Sprintf(check.reason, description, containerA.Name, index)) | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue