Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Labels added to mark roles of the Redis Pods as Master and slave #307

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 73 additions & 1 deletion operator/redisfailover/service/heal.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,21 @@ import (
"errors"
"sort"
"strconv"
"fmt"
"encoding/json"

redisfailoverv1 "github.com/spotahome/redis-operator/api/redisfailover/v1"
"github.com/spotahome/redis-operator/log"
"github.com/spotahome/redis-operator/service/k8s"
"github.com/spotahome/redis-operator/service/redis"
"k8s.io/apimachinery/pkg/types"
)
//RedisFailoverHeal defines struct to update the labels of the Role of a given POD as master or slave
type patchStringValue struct {
Op string `json:"op"`
Path string `json:"path"`
Value string `json:"value"`
}

// RedisFailoverHeal defines the interface able to fix the problems on the redis failovers
type RedisFailoverHeal interface {
Expand Down Expand Up @@ -46,7 +55,6 @@ func (r *RedisFailoverHealer) MakeMaster(ip string, rf *redisfailoverv1.RedisFai
if err != nil {
return err
}

return r.redisClient.MakeMaster(ip, password)
}

Expand Down Expand Up @@ -75,11 +83,43 @@ func (r *RedisFailoverHealer) SetOldestAsMaster(rf *redisfailoverv1.RedisFailove
if newMasterIP == "" {
newMasterIP = pod.Status.PodIP
r.logger.Debugf("New master is %s with ip %s", pod.Name, newMasterIP)
// Assigns role label of Pod as Master
var updateErr error
kubeClient := r.k8sService.GetCoreV1()
api := kubeClient.CoreV1()
payload := []patchStringValue{{
Op: "replace",
Path: "/metadata/labels/role",
Value: "master",
}}
payloadBytes, _ := json.Marshal(payload)
_, updateErr = api.Pods(pod.GetNamespace()).Patch(pod.GetName(), types.JSONPatchType, payloadBytes)
if updateErr == nil {
fmt.Println(fmt.Sprintf("Pod %s labelled Master successfully.", pod.GetName()))
} else {
fmt.Println(updateErr)
}
if err := r.redisClient.MakeMaster(newMasterIP, password); err != nil {
return err
}
} else {
r.logger.Debugf("Making pod %s slave of %s", pod.Name, newMasterIP)
// Assigns role label of Pod as Slave
var updateErr error
kubeClient := r.k8sService.GetCoreV1()
api := kubeClient.CoreV1()
payload := []patchStringValue{{
Op: "replace",
Path: "/metadata/labels/role",
Value: "slave",
}}
payloadBytes, _ := json.Marshal(payload)
_, updateErr = api.Pods(pod.GetNamespace()).Patch(pod.GetName(), types.JSONPatchType, payloadBytes)
if updateErr == nil {
fmt.Println(fmt.Sprintf("Pod %s labelled Slave successfully.", pod.GetName()))
} else {
fmt.Println(updateErr)
}
if err := r.redisClient.MakeSlaveOf(pod.Status.PodIP, newMasterIP, password); err != nil {
return err
}
Expand All @@ -106,11 +146,43 @@ func (r *RedisFailoverHealer) SetMasterOnAll(masterIP string, rf *redisfailoverv
if err := r.redisClient.MakeMaster(masterIP, password); err != nil {
return err
}
// Assigns role label of Pod as Slave
var updateErr error
kubeClient := r.k8sService.GetCoreV1()
api := kubeClient.CoreV1()
payload := []patchStringValue{{
Op: "replace",
Path: "/metadata/labels/role",
Value: "master",
}}
payloadBytes, _ := json.Marshal(payload)
_, updateErr = api.Pods(pod.GetNamespace()).Patch(pod.GetName(), types.JSONPatchType, payloadBytes)
if updateErr == nil {
fmt.Println(fmt.Sprintf("Pod %s labelled Master successfully.", pod.GetName()))
} else {
fmt.Println(updateErr)
}
} else {
r.logger.Debugf("Making pod %s slave of %s", pod.Name, masterIP)
if err := r.redisClient.MakeSlaveOf(pod.Status.PodIP, masterIP, password); err != nil {
return err
}
// Assigns role label of Pod as Slave
var updateErr error
kubeClient := r.k8sService.GetCoreV1()
api := kubeClient.CoreV1()
payload := []patchStringValue{{
Op: "replace",
Path: "/metadata/labels/role",
Value: "slave",
}}
payloadBytes, _ := json.Marshal(payload)
_, updateErr = api.Pods(pod.GetNamespace()).Patch(pod.GetName(), types.JSONPatchType, payloadBytes)
if updateErr == nil {
fmt.Println(fmt.Sprintf("Pod %s labelled Slave successfully.", pod.GetName()))
} else {
fmt.Println(updateErr)
}
}
}
return nil
Expand Down
6 changes: 6 additions & 0 deletions service/k8s/statefulset.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ type StatefulSet interface {
CreateOrUpdateStatefulSet(namespace string, statefulSet *appsv1.StatefulSet) error
DeleteStatefulSet(namespace string, name string) error
ListStatefulSets(namespace string) (*appsv1.StatefulSetList, error)
GetCoreV1() (kubernetes.Interface)
}

// StatefulSetService is the service account service implementation using API calls to kubernetes.
Expand Down Expand Up @@ -111,3 +112,8 @@ func (s *StatefulSetService) DeleteStatefulSet(namespace, name string) error {
func (s *StatefulSetService) ListStatefulSets(namespace string) (*appsv1.StatefulSetList, error) {
return s.kubeClient.AppsV1().StatefulSets(namespace).List(metav1.ListOptions{})
}

//Returns the kubernetes client interface
func (s *StatefulSetService) GetCoreV1() ( (kubernetes.Interface)) {
return s.kubeClient
}