forked from docker/compose-on-kubernetes
/
stateful-set.go
53 lines (46 loc) · 1.66 KB
/
stateful-set.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package convert
import (
"github.com/docker/compose-on-kubernetes/api/compose/latest"
appsv1beta2 "k8s.io/api/apps/v1beta2"
apiv1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
// toStatefulSet converts a Compose Service to a Kube StatefulSet if its replica mode is NOT `global
// and it has persistent volumes.
func toStatefulSet(s latest.ServiceConfig, objectMeta metav1.ObjectMeta, podTemplate apiv1.PodTemplateSpec,
labelSelector map[string]string, original appsv1beta2.StatefulSet) *appsv1beta2.StatefulSet {
revisionHistoryLimit := int32(3)
res := original.DeepCopy()
res.ObjectMeta = objectMeta
res.Spec.Replicas = toReplicas(s.Deploy.Replicas)
res.Spec.RevisionHistoryLimit = &revisionHistoryLimit
res.Spec.Template = forceRestartPolicy(podTemplate, apiv1.RestartPolicyAlways)
res.Spec.UpdateStrategy = toStatefulSetUpdateStrategy(s, res.Spec.UpdateStrategy)
res.Spec.VolumeClaimTemplates = toPersistentVolumeClaims(s, res.Spec.VolumeClaimTemplates)
res.Spec.Selector = &metav1.LabelSelector{
MatchLabels: labelSelector,
}
return res
}
func toStatefulSetUpdateStrategy(s latest.ServiceConfig, original appsv1beta2.StatefulSetUpdateStrategy) appsv1beta2.StatefulSetUpdateStrategy {
config := s.Deploy.UpdateConfig
if config == nil {
return original
}
if config.Parallelism == nil {
return original
}
return appsv1beta2.StatefulSetUpdateStrategy{
Type: appsv1beta2.RollingUpdateStatefulSetStrategyType,
RollingUpdate: &appsv1beta2.RollingUpdateStatefulSetStrategy{
Partition: int32Ptr(config.Parallelism),
},
}
}
func int32Ptr(value *uint64) *int32 {
if value == nil {
return nil
}
result := int32(*value)
return &result
}