From 0781bfb038e60cfdf3baea074dcba69c665fc5f2 Mon Sep 17 00:00:00 2001 From: "angelopez.it" Date: Sun, 14 Jun 2020 18:48:07 +0200 Subject: [PATCH 01/16] make operator able to chose when a cluster is bind to the hosts (ex. when you need to access from outside k8s without a proxy) --- .../v1alpha1/distributedrediscluster_types.go | 1 + .../redis/v1alpha1/zz_generated.deepcopy.go | 3 ++ pkg/resources/statefulsets/statefulset.go | 31 ++++++++++++------- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/pkg/apis/redis/v1alpha1/distributedrediscluster_types.go b/pkg/apis/redis/v1alpha1/distributedrediscluster_types.go index 2a41fb433..27584a8d0 100644 --- a/pkg/apis/redis/v1alpha1/distributedrediscluster_types.go +++ b/pkg/apis/redis/v1alpha1/distributedrediscluster_types.go @@ -36,6 +36,7 @@ type DistributedRedisClusterSpec struct { PasswordSecret *corev1.LocalObjectReference `json:"passwordSecret,omitempty"` Monitor *AgentSpec `json:"monitor,omitempty"` Init *InitSpec `json:"init,omitempty"` + hostNetwork bool `json:"hostNetwork,omitempty"` } type AgentSpec struct { diff --git a/pkg/apis/redis/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/redis/v1alpha1/zz_generated.deepcopy.go index 16d8e247e..dda2e18ad 100644 --- a/pkg/apis/redis/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/redis/v1alpha1/zz_generated.deepcopy.go @@ -213,6 +213,9 @@ func (in *DistributedRedisClusterSpec) DeepCopyInto(out *DistributedRedisCluster *out = new(InitSpec) (*in).DeepCopyInto(*out) } + if in.hostNetwork != nil { + out.hostNetwork = in.hostNetwork + } return } diff --git a/pkg/resources/statefulsets/statefulset.go b/pkg/resources/statefulsets/statefulset.go index 11a503449..643c66159 100644 --- a/pkg/resources/statefulsets/statefulset.go +++ b/pkg/resources/statefulsets/statefulset.go @@ -67,9 +67,10 @@ func NewStatefulSetForCR(cluster *redisv1alpha1.DistributedRedisCluster, ssName, SecurityContext: spec.SecurityContext, NodeSelector: cluster.Spec.NodeSelector, Containers: []corev1.Container{ - redisServerContainer(cluster, password), + redisServerContainer(cluster, password, spec.hostNetwork), }, Volumes: volumes, + HostNetwork: spec.hostNetwork, }, }, }, @@ -225,7 +226,21 @@ func mergeRenameCmds(userCmds []string, systemRenameCmdMap map[string]string) [] return cmds } -func redisServerContainer(cluster *redisv1alpha1.DistributedRedisCluster, password *corev1.EnvVar) corev1.Container { +func _createContainerPort(name string, port int32, hostNetwork bool) corev1.ContainerPort { + var containerPort = corev1.ContainerPort{ + Name: name, + ContainerPort: port, + Protocol: corev1.ProtocolTCP, + } + + if hostNetwork { + containerPort.HostPort = port + } + + return containerPort +} + +func redisServerContainer(cluster *redisv1alpha1.DistributedRedisCluster, password *corev1.EnvVar, hostNetwork bool) corev1.Container { probeArg := "redis-cli -h $(hostname) ping" container := corev1.Container{ @@ -233,16 +248,8 @@ func redisServerContainer(cluster *redisv1alpha1.DistributedRedisCluster, passwo Image: cluster.Spec.Image, ImagePullPolicy: cluster.Spec.ImagePullPolicy, Ports: []corev1.ContainerPort{ - { - Name: "client", - ContainerPort: 6379, - Protocol: corev1.ProtocolTCP, - }, - { - Name: "gossip", - ContainerPort: 16379, - Protocol: corev1.ProtocolTCP, - }, + _createContainerPort("client", 6379, hostNetwork), + _createContainerPort("gossip", 16379, hostNetwork), }, VolumeMounts: volumeMounts(), Command: getRedisCommand(cluster, password), From 09ad959e573eb7c74f31fbfb3f4e81245fff7400 Mon Sep 17 00:00:00 2001 From: "angelopez.it" Date: Sun, 14 Jun 2020 18:57:15 +0200 Subject: [PATCH 02/16] export variable and remove unnecessary condition of nil bool --- pkg/apis/redis/v1alpha1/distributedrediscluster_types.go | 2 +- pkg/apis/redis/v1alpha1/zz_generated.deepcopy.go | 4 +--- pkg/resources/statefulsets/statefulset.go | 4 ++-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/pkg/apis/redis/v1alpha1/distributedrediscluster_types.go b/pkg/apis/redis/v1alpha1/distributedrediscluster_types.go index 27584a8d0..95615de65 100644 --- a/pkg/apis/redis/v1alpha1/distributedrediscluster_types.go +++ b/pkg/apis/redis/v1alpha1/distributedrediscluster_types.go @@ -36,7 +36,7 @@ type DistributedRedisClusterSpec struct { PasswordSecret *corev1.LocalObjectReference `json:"passwordSecret,omitempty"` Monitor *AgentSpec `json:"monitor,omitempty"` Init *InitSpec `json:"init,omitempty"` - hostNetwork bool `json:"hostNetwork,omitempty"` + HostNetwork bool `json:"hostNetwork,omitempty"` } type AgentSpec struct { diff --git a/pkg/apis/redis/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/redis/v1alpha1/zz_generated.deepcopy.go index dda2e18ad..28d7a9bf0 100644 --- a/pkg/apis/redis/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/redis/v1alpha1/zz_generated.deepcopy.go @@ -213,9 +213,7 @@ func (in *DistributedRedisClusterSpec) DeepCopyInto(out *DistributedRedisCluster *out = new(InitSpec) (*in).DeepCopyInto(*out) } - if in.hostNetwork != nil { - out.hostNetwork = in.hostNetwork - } + out.HostNetwork = in.HostNetwork return } diff --git a/pkg/resources/statefulsets/statefulset.go b/pkg/resources/statefulsets/statefulset.go index 643c66159..dff052d82 100644 --- a/pkg/resources/statefulsets/statefulset.go +++ b/pkg/resources/statefulsets/statefulset.go @@ -67,10 +67,10 @@ func NewStatefulSetForCR(cluster *redisv1alpha1.DistributedRedisCluster, ssName, SecurityContext: spec.SecurityContext, NodeSelector: cluster.Spec.NodeSelector, Containers: []corev1.Container{ - redisServerContainer(cluster, password, spec.hostNetwork), + redisServerContainer(cluster, password, spec.HostNetwork), }, Volumes: volumes, - HostNetwork: spec.hostNetwork, + HostNetwork: spec.HostNetwork, }, }, }, From defa632854a6d219d9b3dec73e5c5d0581e7ad97 Mon Sep 17 00:00:00 2001 From: "angelopez.it" Date: Sun, 14 Jun 2020 19:01:11 +0200 Subject: [PATCH 03/16] remove typo underscore. --- pkg/resources/statefulsets/statefulset.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/resources/statefulsets/statefulset.go b/pkg/resources/statefulsets/statefulset.go index dff052d82..d4564517c 100644 --- a/pkg/resources/statefulsets/statefulset.go +++ b/pkg/resources/statefulsets/statefulset.go @@ -226,7 +226,7 @@ func mergeRenameCmds(userCmds []string, systemRenameCmdMap map[string]string) [] return cmds } -func _createContainerPort(name string, port int32, hostNetwork bool) corev1.ContainerPort { +func createContainerPort(name string, port int32, hostNetwork bool) corev1.ContainerPort { var containerPort = corev1.ContainerPort{ Name: name, ContainerPort: port, @@ -248,8 +248,8 @@ func redisServerContainer(cluster *redisv1alpha1.DistributedRedisCluster, passwo Image: cluster.Spec.Image, ImagePullPolicy: cluster.Spec.ImagePullPolicy, Ports: []corev1.ContainerPort{ - _createContainerPort("client", 6379, hostNetwork), - _createContainerPort("gossip", 16379, hostNetwork), + createContainerPort("client", 6379, hostNetwork), + createContainerPort("gossip", 16379, hostNetwork), }, VolumeMounts: volumeMounts(), Command: getRedisCommand(cluster, password), From a931b687db285518c0b59aaa04efbcb9d78b7a6f Mon Sep 17 00:00:00 2001 From: "angelopez.it" Date: Thu, 13 Aug 2020 17:08:16 +0200 Subject: [PATCH 04/16] make configurable the port in all places but in the redis conf file. --- pkg/apis/redis/v1alpha1/default.go | 12 +++++++++++ .../v1alpha1/distributedrediscluster_types.go | 2 ++ pkg/config/redis.go | 4 ---- .../distributedrediscluster_controller.go | 7 +++---- .../distributedrediscluster/helper.go | 5 +++-- .../distributedrediscluster/sync_handler.go | 8 ++++---- pkg/controller/heal/failednodes.go | 2 +- pkg/controller/heal/untrustenodes.go | 2 +- pkg/redisutil/admin.go | 18 +++++++++-------- pkg/redisutil/clusterinfo.go | 10 +++++----- pkg/redisutil/node.go | 20 +++---------------- pkg/resources/configmaps/configmap.go | 4 ++-- pkg/resources/services/service.go | 8 ++++---- pkg/resources/statefulsets/statefulset.go | 4 ++-- test/e2e/operator_util.go | 9 +++++---- 15 files changed, 57 insertions(+), 58 deletions(-) diff --git a/pkg/apis/redis/v1alpha1/default.go b/pkg/apis/redis/v1alpha1/default.go index 32f4dfed7..563f2ab25 100644 --- a/pkg/apis/redis/v1alpha1/default.go +++ b/pkg/apis/redis/v1alpha1/default.go @@ -16,6 +16,8 @@ const ( minClusterReplicas = 1 defaultRedisImage = "redis:5.0.4-alpine" defaultMonitorImage = "oliver006/redis_exporter:latest" + defaultClientPort = 6379 + defaultGossipPort = 16379 ) func (in *DistributedRedisCluster) DefaultSpec(log logr.Logger) bool { @@ -25,6 +27,16 @@ func (in *DistributedRedisCluster) DefaultSpec(log logr.Logger) bool { update = true } + if in.Spec.ClientPort == 0 { + in.Spec.ClientPort = defaultClientPort + update = true + } + + if in.Spec.GossipPort == 0 { + in.Spec.GossipPort = defaultGossipPort + update = true + } + if in.Spec.Image == "" { in.Spec.Image = defaultRedisImage update = true diff --git a/pkg/apis/redis/v1alpha1/distributedrediscluster_types.go b/pkg/apis/redis/v1alpha1/distributedrediscluster_types.go index 95615de65..6eb800ad8 100644 --- a/pkg/apis/redis/v1alpha1/distributedrediscluster_types.go +++ b/pkg/apis/redis/v1alpha1/distributedrediscluster_types.go @@ -37,6 +37,8 @@ type DistributedRedisClusterSpec struct { Monitor *AgentSpec `json:"monitor,omitempty"` Init *InitSpec `json:"init,omitempty"` HostNetwork bool `json:"hostNetwork,omitempty"` + ClientPort int `json:"clientPort,omitempty"` + GossipPort int `json:"gossipPort,omitempty"` } type AgentSpec struct { diff --git a/pkg/config/redis.go b/pkg/config/redis.go index 72ca11d00..49ae4f746 100644 --- a/pkg/config/redis.go +++ b/pkg/config/redis.go @@ -20,8 +20,6 @@ const ( RedisConfigFileDefault = "/redis-conf/redis.conf" // RedisServerBinDefault default binary name RedisServerBinDefault = "redis-server" - // RedisServerPortDefault default redis port - RedisServerPortDefault = "6379" // RedisMaxMemoryDefault default redis max memory RedisMaxMemoryDefault = 0 // RedisMaxMemoryPolicyDefault default redis max memory evition policy @@ -53,7 +51,6 @@ type Redis struct { RenameCommandsFile string HTTPServerAddr string ServerBin string - ServerPort string ServerIP string MaxMemory uint32 MaxMemoryPolicy string @@ -70,7 +67,6 @@ func (r *Redis) AddFlags(fs *pflag.FlagSet) { fs.Uint32Var(&r.MaxMemory, "max-memory", RedisMaxMemoryDefault, "redis max memory") fs.StringVar(&r.MaxMemoryPolicy, "max-memory-policy", RedisMaxMemoryPolicyDefault, "redis max memory evition policy") fs.StringVar(&r.ServerBin, "bin", RedisServerBinDefault, "redis server binary file name") - fs.StringVar(&r.ServerPort, "port", RedisServerPortDefault, "redis server listen port") fs.StringVar(&r.ServerIP, "ip", "", "redis server listen ip") fs.StringArrayVar(&r.ConfigFiles, "config-file", []string{}, "Location of redis configuration file that will be include in the ") } diff --git a/pkg/controller/distributedrediscluster/distributedrediscluster_controller.go b/pkg/controller/distributedrediscluster/distributedrediscluster_controller.go index cdac41db7..c3192e491 100644 --- a/pkg/controller/distributedrediscluster/distributedrediscluster_controller.go +++ b/pkg/controller/distributedrediscluster/distributedrediscluster_controller.go @@ -232,13 +232,13 @@ func (r *ReconcileDistributedRedisCluster) Reconcile(request reconcile.Request) return reconcile.Result{}, Kubernetes.Wrap(err, "getClusterPassword") } - admin, err := newRedisAdmin(ctx.pods, password, config.RedisConf(), reqLogger) + admin, err := newRedisAdmin(ctx.pods, password, config.RedisConf(), reqLogger, instance.Spec.ClientPort) if err != nil { return reconcile.Result{}, Redis.Wrap(err, "newRedisAdmin") } defer admin.Close() - clusterInfos, err := admin.GetClusterInfos() + clusterInfos, err := admin.GetClusterInfos(ctx.cluster.Spec.ClientPort) if err != nil { if clusterInfos.Status == redisutil.ClusterInfosPartial { return reconcile.Result{}, Redis.Wrap(err, "GetClusterInfos") @@ -331,8 +331,7 @@ func (r *ReconcileDistributedRedisCluster) Reconcile(request reconcile.Request) return reconcile.Result{}, err } } - - newClusterInfos, err := admin.GetClusterInfos() + newClusterInfos, err := admin.GetClusterInfos(ctx.cluster.Spec.ClientPort) if err != nil { if clusterInfos.Status == redisutil.ClusterInfosPartial { return reconcile.Result{}, Redis.Wrap(err, "GetClusterInfos") diff --git a/pkg/controller/distributedrediscluster/helper.go b/pkg/controller/distributedrediscluster/helper.go index 6df04bba7..7773c9841 100644 --- a/pkg/controller/distributedrediscluster/helper.go +++ b/pkg/controller/distributedrediscluster/helper.go @@ -3,6 +3,7 @@ package distributedrediscluster import ( "fmt" "net" + "strconv" "time" "github.com/go-logr/logr" @@ -29,10 +30,10 @@ func getLabels(cluster *redisv1alpha1.DistributedRedisCluster) map[string]string } // newRedisAdmin builds and returns new redis.Admin from the list of pods -func newRedisAdmin(pods []*corev1.Pod, password string, cfg *config.Redis, reqLogger logr.Logger) (redisutil.IAdmin, error) { +func newRedisAdmin(pods []*corev1.Pod, password string, cfg *config.Redis, reqLogger logr.Logger, clientPort int) (redisutil.IAdmin, error) { nodesAddrs := []string{} for _, pod := range pods { - redisPort := redisutil.DefaultRedisPort + redisPort := strconv.Itoa(clientPort) for _, container := range pod.Spec.Containers { if container.Name == "redis" { for _, port := range container.Ports { diff --git a/pkg/controller/distributedrediscluster/sync_handler.go b/pkg/controller/distributedrediscluster/sync_handler.go index 61af25e8b..9015ecd2a 100644 --- a/pkg/controller/distributedrediscluster/sync_handler.go +++ b/pkg/controller/distributedrediscluster/sync_handler.go @@ -161,7 +161,7 @@ func (r *ReconcileDistributedRedisCluster) initRestore(cluster *redisv1alpha1.Di } func (r *ReconcileDistributedRedisCluster) waitForClusterJoin(ctx *syncContext) error { - if infos, err := ctx.admin.GetClusterInfos(); err == nil { + if infos, err := ctx.admin.GetClusterInfos(ctx.cluster.Spec.ClientPort); err == nil { ctx.reqLogger.V(6).Info("debug waitForClusterJoin", "cluster infos", infos) return nil } @@ -180,7 +180,7 @@ func (r *ReconcileDistributedRedisCluster) waitForClusterJoin(ctx *syncContext) // the config as they are still empty with unassigned slots. time.Sleep(1 * time.Second) - _, err = ctx.admin.GetClusterInfos() + _, err = ctx.admin.GetClusterInfos(ctx.cluster.Spec.ClientPort) if err != nil { return Requeue.Wrap(err, "wait for cluster join") } @@ -278,7 +278,7 @@ func (r *ReconcileDistributedRedisCluster) scalingDown(ctx *syncContext, current if len(node.Slots) > 0 { return Redis.New(fmt.Sprintf("node %s is not empty! Reshard data away and try again", node.String())) } - if err := admin.ForgetNode(node.ID); err != nil { + if err := admin.ForgetNode(node.ID,ctx.cluster.Spec.ClientPort); err != nil { return Redis.Wrap(err, "ForgetNode") } } @@ -346,7 +346,7 @@ func (r *ReconcileDistributedRedisCluster) resetClusterPassword(ctx *syncContext } podSet := clusterPods(redisClusterPods.Items) - admin, err := newRedisAdmin(podSet, oldPassword, config.RedisConf(), ctx.reqLogger) + admin, err := newRedisAdmin(podSet, oldPassword, config.RedisConf(), ctx.reqLogger, ctx.cluster.Spec.ClientPort) if err != nil { return err } diff --git a/pkg/controller/heal/failednodes.go b/pkg/controller/heal/failednodes.go index c0e70ebf6..d425885f4 100644 --- a/pkg/controller/heal/failednodes.go +++ b/pkg/controller/heal/failednodes.go @@ -17,7 +17,7 @@ func (c *CheckAndHeal) FixFailedNodes(cluster *redisv1alpha1.DistributedRedisClu c.Logger.Info("[FixFailedNodes] Forgetting failed node, this command might fail, this is not an error", "node", id) if !c.DryRun { c.Logger.Info("[FixFailedNodes] try to forget node", "nodeId", id) - if err := admin.ForgetNode(id); err != nil { + if err := admin.ForgetNode(id, cluster.Spec.ClientPort); err != nil { errs = append(errs, err) } } diff --git a/pkg/controller/heal/untrustenodes.go b/pkg/controller/heal/untrustenodes.go index 3d6f45026..ed3c05c29 100644 --- a/pkg/controller/heal/untrustenodes.go +++ b/pkg/controller/heal/untrustenodes.go @@ -43,7 +43,7 @@ func (c *CheckAndHeal) FixUntrustedNodes(cluster *redisv1alpha1.DistributedRedis doneAnAction = true if !c.DryRun { c.Logger.Info("[FixUntrustedNodes] try to forget node", "nodeId", id) - if err := admin.ForgetNode(id); err != nil { + if err := admin.ForgetNode(id,cluster.Spec.ClientPort); err != nil { errs = append(errs, err) } } diff --git a/pkg/redisutil/admin.go b/pkg/redisutil/admin.go index af5e1455a..9a306f0b9 100644 --- a/pkg/redisutil/admin.go +++ b/pkg/redisutil/admin.go @@ -38,7 +38,7 @@ type IAdmin interface { // Close the admin connections Close() // GetClusterInfos get node infos for all nodes - GetClusterInfos() (*ClusterInfos, error) + GetClusterInfos(port int) (*ClusterInfos, error) // ClusterManagerNodeIsEmpty Checks whether the node is empty. Node is considered not-empty if it has // some key or if it already knows other nodes ClusterManagerNodeIsEmpty() (bool, error) @@ -56,7 +56,7 @@ type IAdmin interface { // DetachSlave dettach a slave to its master DetachSlave(slave *Node) error // ForgetNode execute the Redis command to force the cluster to forgot the the Node - ForgetNode(id string) error + ForgetNode(id string, port int) error // SetSlots exec the redis command to set slots in a pipeline, provide // and empty nodeID if the set slots commands doesn't take a nodeID in parameter SetSlots(addr string, action string, slots []Slot, nodeID string) error @@ -117,12 +117,12 @@ func (a *Admin) Close() { } // GetClusterInfos return the Nodes infos for all nodes -func (a *Admin) GetClusterInfos() (*ClusterInfos, error) { +func (a *Admin) GetClusterInfos(port int) (*ClusterInfos, error) { infos := NewClusterInfos() clusterErr := NewClusterInfosError() for addr, c := range a.Connections().GetAll() { - nodeinfos, err := a.getInfos(c, addr) + nodeinfos, err := a.getInfos(c, addr, port) if err != nil { a.log.WithValues("err", err).Info("get redis info failed") infos.Status = ClusterInfosPartial @@ -146,7 +146,7 @@ func (a *Admin) GetClusterInfos() (*ClusterInfos, error) { return infos, clusterErr } -func (a *Admin) getInfos(c IClient, addr string) (*NodeInfos, error) { +func (a *Admin) getInfos(c IClient, addr string, port int) (*NodeInfos, error) { resp := c.Cmd("CLUSTER", "NODES") if err := a.Connections().ValidateResp(resp, addr, "unable to retrieve node info"); err != nil { return nil, err @@ -160,7 +160,7 @@ func (a *Admin) getInfos(c IClient, addr string) (*NodeInfos, error) { return nil, fmt.Errorf("wrong format from CLUSTER NODES: %v", err) } - nodeInfos := DecodeNodeInfos(&raw, addr, a.log) + nodeInfos := DecodeNodeInfos(&raw, addr, a.log, port) return nodeInfos, nil } @@ -483,8 +483,10 @@ func (a *Admin) migrateCmdArgs(dest *Node, timeoutStr string, replace bool, keys } // ForgetNode used to force other redis cluster node to forget a specific node -func (a *Admin) ForgetNode(id string) error { - infos, _ := a.GetClusterInfos() +func (a *Admin) ForgetNode(id string,port int) error { + //TODO we have no cluster info, search upper + + infos, _ := a.GetClusterInfos(port) for nodeAddr, nodeinfos := range infos.Infos { if nodeinfos.Node.ID == id { continue diff --git a/pkg/redisutil/clusterinfo.go b/pkg/redisutil/clusterinfo.go index 57b5fd097..3aebc2ebb 100644 --- a/pkg/redisutil/clusterinfo.go +++ b/pkg/redisutil/clusterinfo.go @@ -38,9 +38,9 @@ type ClusterInfos struct { } // NewNodeInfos returns an instance of NodeInfo -func NewNodeInfos() *NodeInfos { +func NewNodeInfos(port int) *NodeInfos { return &NodeInfos{ - Node: NewDefaultNode(), + Node: NewDefaultNode(port), Friends: Nodes{}, } } @@ -72,8 +72,8 @@ func DecodeNodeStartTime(input *string, log logr.Logger) (time.Time, error) { } // DecodeNodeInfos decode from the cmd output the Redis nodes info. Second argument is the node on which we are connected to request info -func DecodeNodeInfos(input *string, addr string, log logr.Logger) *NodeInfos { - infos := NewNodeInfos() +func DecodeNodeInfos(input *string, addr string, log logr.Logger, port int) *NodeInfos { + infos := NewNodeInfos(port) lines := strings.Split(*input, "\n") for _, line := range lines { values := strings.Split(line, " ") @@ -82,7 +82,7 @@ func DecodeNodeInfos(input *string, addr string, log logr.Logger) *NodeInfos { log.V(7).Info(fmt.Sprintf("not enough values in line split, ignoring line: '%s'", line)) continue } else { - node := NewDefaultNode() + node := NewDefaultNode(port) node.ID = values[0] //remove trailing port for cluster internal protocol diff --git a/pkg/redisutil/node.go b/pkg/redisutil/node.go index 9829ad400..97f45386e 100644 --- a/pkg/redisutil/node.go +++ b/pkg/redisutil/node.go @@ -5,18 +5,15 @@ import ( "fmt" "net" "sort" + "strconv" "strings" "time" - corev1 "k8s.io/api/core/v1" - redisv1alpha1 "github.com/ucloud/redis-cluster-operator/pkg/apis/redis/v1alpha1" "github.com/ucloud/redis-cluster-operator/pkg/utils" ) const ( - // DefaultRedisPort define the default Redis Port - DefaultRedisPort = "6379" // RedisMasterRole redis role master RedisMasterRole = "master" // RedisSlaveRole redis role slave @@ -79,26 +76,15 @@ func (n Nodes) String() string { } // NewDefaultNode builds and returns new defaultNode instance -func NewDefaultNode() *Node { +func NewDefaultNode(port int) *Node { return &Node{ - Port: DefaultRedisPort, + Port: strconv.Itoa(port), Slots: []Slot{}, MigratingSlots: map[Slot]string{}, ImportingSlots: map[Slot]string{}, } } -// NewNode builds and returns new Node instance -func NewNode(id, ip string, pod *corev1.Pod) *Node { - node := NewDefaultNode() - node.ID = id - node.IP = ip - node.PodName = pod.Name - node.NodeName = pod.Spec.NodeName - - return node -} - // SetRole from a flags string list set the Node's role func (n *Node) SetRole(flags string) error { n.Role = "" // reset value before setting the new one diff --git a/pkg/resources/configmaps/configmap.go b/pkg/resources/configmaps/configmap.go index 97735cfd2..d6362f570 100644 --- a/pkg/resources/configmaps/configmap.go +++ b/pkg/resources/configmaps/configmap.go @@ -27,7 +27,7 @@ failover() { echo "Do CLUSTER FAILOVER" masterID=$(cat ${CLUSTER_CONFIG} | grep "myself" | awk '{print $1}') echo "Master: ${masterID}" - slave=$(cat ${CLUSTER_CONFIG} | grep ${masterID} | grep "slave" | awk 'NR==1{print $2}' | sed 's/:6379@16379//') + slave=$(cat ${CLUSTER_CONFIG} | grep ${masterID} | grep "slave" | awk 'NR==1{print $2}' | sed 's/:`+strconv.Itoa(cluster.Spec.ClientPort)+`@`+strconv.Itoa(cluster.Spec.GossipPort)+`//') echo "Slave: ${slave}" password=$(cat /data/redis_password) if [[ -z "${password}" ]]; then @@ -53,7 +53,7 @@ if [ -f ${CLUSTER_CONFIG} ]; then exit 1 fi echo "Updating my IP to ${POD_IP} in ${CLUSTER_CONFIG}" - sed -i.bak -e "/myself/ s/ .*:6379@16379/ ${POD_IP}:6379@16379/" ${CLUSTER_CONFIG} + sed -i.bak -e "/myself/ s/ .*:`+strconv.Itoa(cluster.Spec.ClientPort)+`@`+strconv.Itoa(cluster.Spec.GossipPort)+`/ ${POD_IP}:`+strconv.Itoa(cluster.Spec.ClientPort)+`@`+strconv.Itoa(cluster.Spec.GossipPort)+`/" ${CLUSTER_CONFIG} fi exec "$@"` diff --git a/pkg/resources/services/service.go b/pkg/resources/services/service.go index 1af158508..4788bc8f2 100644 --- a/pkg/resources/services/service.go +++ b/pkg/resources/services/service.go @@ -9,8 +9,8 @@ import ( // NewHeadLessSvcForCR creates a new headless service for the given Cluster. func NewHeadLessSvcForCR(cluster *redisv1alpha1.DistributedRedisCluster, name string, labels map[string]string) *corev1.Service { - clientPort := corev1.ServicePort{Name: "client", Port: 6379} - gossipPort := corev1.ServicePort{Name: "gossip", Port: 16379} + clientPort := corev1.ServicePort{Name: "client", Port: cluster.Spec.ClientPort} + gossipPort := corev1.ServicePort{Name: "gossip", Port: cluster.Spec.GossipPort} svc := &corev1.Service{ ObjectMeta: metav1.ObjectMeta{ Labels: labels, @@ -29,8 +29,8 @@ func NewHeadLessSvcForCR(cluster *redisv1alpha1.DistributedRedisCluster, name st } func NewSvcForCR(cluster *redisv1alpha1.DistributedRedisCluster, name string, labels map[string]string) *corev1.Service { - clientPort := corev1.ServicePort{Name: "client", Port: 6379} - gossipPort := corev1.ServicePort{Name: "gossip", Port: 16379} + clientPort := corev1.ServicePort{Name: "client", Port: cluster.Spec.ClientPort} + gossipPort := corev1.ServicePort{Name: "gossip", Port: cluster.Spec.GossipPort} svc := &corev1.Service{ ObjectMeta: metav1.ObjectMeta{ Labels: labels, diff --git a/pkg/resources/statefulsets/statefulset.go b/pkg/resources/statefulsets/statefulset.go index d4564517c..23060f502 100644 --- a/pkg/resources/statefulsets/statefulset.go +++ b/pkg/resources/statefulsets/statefulset.go @@ -248,8 +248,8 @@ func redisServerContainer(cluster *redisv1alpha1.DistributedRedisCluster, passwo Image: cluster.Spec.Image, ImagePullPolicy: cluster.Spec.ImagePullPolicy, Ports: []corev1.ContainerPort{ - createContainerPort("client", 6379, hostNetwork), - createContainerPort("gossip", 16379, hostNetwork), + createContainerPort("client", cluster.Spec.ClientPort, hostNetwork), + createContainerPort("gossip", cluster.Spec.GossipPort, hostNetwork), }, VolumeMounts: volumeMounts(), Command: getRedisCommand(cluster, password), diff --git a/test/e2e/operator_util.go b/test/e2e/operator_util.go index 55630e9c4..b4efbb73d 100644 --- a/test/e2e/operator_util.go +++ b/test/e2e/operator_util.go @@ -6,6 +6,7 @@ import ( "fmt" "net" "os" + "strconv" "time" "github.com/go-logr/logr" @@ -162,12 +163,12 @@ func IsDistributedRedisClusterProperly(f *Framework, drc *redisv1alpha1.Distribu RenameCommandsFile: renameCommandsFile, RenameCommandsPath: renameCommandsPath, } - redisAdmin, err := NewRedisAdmin(podList.Items, password, redisconf, logger) + redisAdmin, err := NewRedisAdmin(podList.Items, password, redisconf, logger, drc.Spec.ClientPort) if err != nil { f.Logf("NewRedisAdmin err: %s", err) return err } - if _, err := redisAdmin.GetClusterInfos(); err != nil { + if _, err := redisAdmin.GetClusterInfos(drc.Spec.ClientPort); err != nil { f.Logf("DistributedRedisCluster Cluster nodes: %s", err) return err } @@ -198,10 +199,10 @@ func getLabels(cluster *redisv1alpha1.DistributedRedisCluster) map[string]string } // NewRedisAdmin builds and returns new redis.Admin from the list of pods -func NewRedisAdmin(pods []corev1.Pod, password string, cfg *config.Redis, reqLogger logr.Logger) (redisutil.IAdmin, error) { +func NewRedisAdmin(pods []corev1.Pod, password string, cfg *config.Redis, reqLogger logr.Logger, clientPort int) (redisutil.IAdmin, error) { nodesAddrs := []string{} for _, pod := range pods { - redisPort := redisutil.DefaultRedisPort + redisPort := strconv.Itoa(clientPort) for _, container := range pod.Spec.Containers { if container.Name == "redis" { for _, port := range container.Ports { From 227c7deac320f4147c3488d2963f3674ecfea494 Mon Sep 17 00:00:00 2001 From: "angelopez.it" Date: Thu, 13 Aug 2020 21:03:56 +0200 Subject: [PATCH 05/16] remove gossip as is always 10000 + clientPort set port to use in redis-server run --- pkg/apis/redis/v1alpha1/default.go | 10 +++++++--- pkg/resources/statefulsets/statefulset.go | 2 ++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/pkg/apis/redis/v1alpha1/default.go b/pkg/apis/redis/v1alpha1/default.go index 563f2ab25..1675384cf 100644 --- a/pkg/apis/redis/v1alpha1/default.go +++ b/pkg/apis/redis/v1alpha1/default.go @@ -17,7 +17,6 @@ const ( defaultRedisImage = "redis:5.0.4-alpine" defaultMonitorImage = "oliver006/redis_exporter:latest" defaultClientPort = 6379 - defaultGossipPort = 16379 ) func (in *DistributedRedisCluster) DefaultSpec(log logr.Logger) bool { @@ -27,13 +26,18 @@ func (in *DistributedRedisCluster) DefaultSpec(log logr.Logger) bool { update = true } + if in.Spec.ClusterReplicas < minClusterReplicas { + in.Spec.ClusterReplicas = minClusterReplicas + update = true + } + if in.Spec.ClientPort == 0 { in.Spec.ClientPort = defaultClientPort update = true } - if in.Spec.GossipPort == 0 { - in.Spec.GossipPort = defaultGossipPort + if in.Spec.GossipPort != (in.Spec.ClientPort + 10000) { + in.Spec.GossipPort = in.Spec.ClientPort + 10000 update = true } diff --git a/pkg/resources/statefulsets/statefulset.go b/pkg/resources/statefulsets/statefulset.go index 23060f502..8e54a30bd 100644 --- a/pkg/resources/statefulsets/statefulset.go +++ b/pkg/resources/statefulsets/statefulset.go @@ -3,6 +3,7 @@ package statefulsets import ( "fmt" "sort" + "strconv" "strings" appsv1 "k8s.io/api/apps/v1" @@ -180,6 +181,7 @@ func getRedisCommand(cluster *redisv1alpha1.DistributedRedisCluster, password *c "/conf/fix-ip.sh", "redis-server", "/conf/redis.conf", + "--port " + strconv.Itoa(cluster.Spec.ClientPort), "--cluster-enabled yes", "--cluster-config-file /data/nodes.conf", } From 4babaf109dbe4e2cd607ac677beba73a2326a6c2 Mon Sep 17 00:00:00 2001 From: "angelopez.it" Date: Fri, 14 Aug 2020 20:49:45 +0200 Subject: [PATCH 06/16] revert stringarg port configuration --- pkg/apis/redis/v1alpha1/distributedrediscluster_types.go | 4 ++-- pkg/config/redis.go | 4 ++++ pkg/resources/services/service.go | 8 ++++---- pkg/resources/statefulsets/statefulset.go | 4 ++-- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/pkg/apis/redis/v1alpha1/distributedrediscluster_types.go b/pkg/apis/redis/v1alpha1/distributedrediscluster_types.go index 6eb800ad8..bae7d7bd4 100644 --- a/pkg/apis/redis/v1alpha1/distributedrediscluster_types.go +++ b/pkg/apis/redis/v1alpha1/distributedrediscluster_types.go @@ -37,8 +37,8 @@ type DistributedRedisClusterSpec struct { Monitor *AgentSpec `json:"monitor,omitempty"` Init *InitSpec `json:"init,omitempty"` HostNetwork bool `json:"hostNetwork,omitempty"` - ClientPort int `json:"clientPort,omitempty"` - GossipPort int `json:"gossipPort,omitempty"` + ClientPort int `json:"clientPort,omitempty"` + GossipPort int `json:"gossipPort,omitempty"` } type AgentSpec struct { diff --git a/pkg/config/redis.go b/pkg/config/redis.go index 49ae4f746..72ca11d00 100644 --- a/pkg/config/redis.go +++ b/pkg/config/redis.go @@ -20,6 +20,8 @@ const ( RedisConfigFileDefault = "/redis-conf/redis.conf" // RedisServerBinDefault default binary name RedisServerBinDefault = "redis-server" + // RedisServerPortDefault default redis port + RedisServerPortDefault = "6379" // RedisMaxMemoryDefault default redis max memory RedisMaxMemoryDefault = 0 // RedisMaxMemoryPolicyDefault default redis max memory evition policy @@ -51,6 +53,7 @@ type Redis struct { RenameCommandsFile string HTTPServerAddr string ServerBin string + ServerPort string ServerIP string MaxMemory uint32 MaxMemoryPolicy string @@ -67,6 +70,7 @@ func (r *Redis) AddFlags(fs *pflag.FlagSet) { fs.Uint32Var(&r.MaxMemory, "max-memory", RedisMaxMemoryDefault, "redis max memory") fs.StringVar(&r.MaxMemoryPolicy, "max-memory-policy", RedisMaxMemoryPolicyDefault, "redis max memory evition policy") fs.StringVar(&r.ServerBin, "bin", RedisServerBinDefault, "redis server binary file name") + fs.StringVar(&r.ServerPort, "port", RedisServerPortDefault, "redis server listen port") fs.StringVar(&r.ServerIP, "ip", "", "redis server listen ip") fs.StringArrayVar(&r.ConfigFiles, "config-file", []string{}, "Location of redis configuration file that will be include in the ") } diff --git a/pkg/resources/services/service.go b/pkg/resources/services/service.go index 4788bc8f2..8713b03dd 100644 --- a/pkg/resources/services/service.go +++ b/pkg/resources/services/service.go @@ -9,8 +9,8 @@ import ( // NewHeadLessSvcForCR creates a new headless service for the given Cluster. func NewHeadLessSvcForCR(cluster *redisv1alpha1.DistributedRedisCluster, name string, labels map[string]string) *corev1.Service { - clientPort := corev1.ServicePort{Name: "client", Port: cluster.Spec.ClientPort} - gossipPort := corev1.ServicePort{Name: "gossip", Port: cluster.Spec.GossipPort} + clientPort := corev1.ServicePort{Name: "client", Port: int32(cluster.Spec.ClientPort)} + gossipPort := corev1.ServicePort{Name: "gossip", Port: int32(cluster.Spec.GossipPort)} svc := &corev1.Service{ ObjectMeta: metav1.ObjectMeta{ Labels: labels, @@ -29,8 +29,8 @@ func NewHeadLessSvcForCR(cluster *redisv1alpha1.DistributedRedisCluster, name st } func NewSvcForCR(cluster *redisv1alpha1.DistributedRedisCluster, name string, labels map[string]string) *corev1.Service { - clientPort := corev1.ServicePort{Name: "client", Port: cluster.Spec.ClientPort} - gossipPort := corev1.ServicePort{Name: "gossip", Port: cluster.Spec.GossipPort} + clientPort := corev1.ServicePort{Name: "client", Port: int32(cluster.Spec.ClientPort)} + gossipPort := corev1.ServicePort{Name: "gossip", Port: int32(cluster.Spec.GossipPort)} svc := &corev1.Service{ ObjectMeta: metav1.ObjectMeta{ Labels: labels, diff --git a/pkg/resources/statefulsets/statefulset.go b/pkg/resources/statefulsets/statefulset.go index 8e54a30bd..562443ee7 100644 --- a/pkg/resources/statefulsets/statefulset.go +++ b/pkg/resources/statefulsets/statefulset.go @@ -250,8 +250,8 @@ func redisServerContainer(cluster *redisv1alpha1.DistributedRedisCluster, passwo Image: cluster.Spec.Image, ImagePullPolicy: cluster.Spec.ImagePullPolicy, Ports: []corev1.ContainerPort{ - createContainerPort("client", cluster.Spec.ClientPort, hostNetwork), - createContainerPort("gossip", cluster.Spec.GossipPort, hostNetwork), + createContainerPort("client", int32(cluster.Spec.ClientPort), hostNetwork), + createContainerPort("gossip", int32(cluster.Spec.GossipPort), hostNetwork), }, VolumeMounts: volumeMounts(), Command: getRedisCommand(cluster, password), From 3dbc1610da02de2319643692b3c5bef72d73c7fb Mon Sep 17 00:00:00 2001 From: "angelopez.it" Date: Fri, 14 Aug 2020 20:53:59 +0200 Subject: [PATCH 07/16] deleted done todo --- pkg/redisutil/admin.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/pkg/redisutil/admin.go b/pkg/redisutil/admin.go index 9a306f0b9..fc0d8f022 100644 --- a/pkg/redisutil/admin.go +++ b/pkg/redisutil/admin.go @@ -484,8 +484,6 @@ func (a *Admin) migrateCmdArgs(dest *Node, timeoutStr string, replace bool, keys // ForgetNode used to force other redis cluster node to forget a specific node func (a *Admin) ForgetNode(id string,port int) error { - //TODO we have no cluster info, search upper - infos, _ := a.GetClusterInfos(port) for nodeAddr, nodeinfos := range infos.Infos { if nodeinfos.Node.ID == id { From 1769dfbb2b2d4f987c1dd655f247d2f820710230 Mon Sep 17 00:00:00 2001 From: "angelopez.it" Date: Sun, 21 Feb 2021 17:47:03 +0100 Subject: [PATCH 08/16] spread port for all operations using cli or -h --- hack/docker/redis-tools/redis-tools.sh | 9 +++++-- make.Dockerfile | 27 +++++++++++++++++++ .../distributedrediscluster/sync_handler.go | 3 ++- .../redisclusterbackup/sync_handler.go | 1 + pkg/resources/configmaps/configmap.go | 4 +-- pkg/resources/statefulsets/statefulset.go | 4 +-- 6 files changed, 41 insertions(+), 7 deletions(-) create mode 100644 make.Dockerfile diff --git a/hack/docker/redis-tools/redis-tools.sh b/hack/docker/redis-tools/redis-tools.sh index 0c157023b..72fe704b8 100644 --- a/hack/docker/redis-tools/redis-tools.sh +++ b/hack/docker/redis-tools/redis-tools.sh @@ -12,6 +12,7 @@ show_help() { echo "-h, --help show brief help" echo " --data-dir=DIR path to directory holding db data (default: /var/data)" echo " --host=HOST database host" + echo " --port=PORT database port" echo " --user=USERNAME database username" echo " --bucket=BUCKET name of bucket" echo " --location=LOCATION location of backend (:)" @@ -50,6 +51,10 @@ while test $# -gt 0; do export REDIS_HOST=$(echo $1 | sed -e 's/^[^=]*=//g') shift ;; + --port*) + export REDIS_PORT=$(echo $1 | sed -e 's/^[^=]*=//g') + shift + ;; --user*) export REDIS_USER=$(echo $1 | sed -e 's/^[^=]*=//g') shift @@ -108,8 +113,8 @@ case "$op" in # cleanup data dump dir rm -rf * - redis-cli --rdb dump.rdb -h "${REDIS_HOST}" -a "${REDIS_PASSWORD}" - redis-cli -h "${REDIS_HOST}" -a "${REDIS_PASSWORD}" CLUSTER NODES | grep myself > nodes.conf + redis-cli --rdb dump.rdb -h "${REDIS_HOST}" -p "${REDIS_PORT}" -a "${REDIS_PASSWORD}" + redis-cli -h "${REDIS_HOST}" -p "${REDIS_PORT}" -a "${REDIS_PASSWORD}" CLUSTER NODES | grep myself > nodes.conf pwd ls -lh "$SOURCE_DIR" echo "Uploading dump file to the backend......." diff --git a/make.Dockerfile b/make.Dockerfile new file mode 100644 index 000000000..41111ec95 --- /dev/null +++ b/make.Dockerfile @@ -0,0 +1,27 @@ +FROM golang:1.13.3 as go-builder + +RUN apt-get update && apt-get -y upgrade && \ + apt-get install -y ca-certificates git mercurial + +ARG PROJECT_NAME=redis-cluster-operator +ARG REPO_PATH=github.com/ucloud/$PROJECT_NAME +ARG BUILD_PATH=${REPO_PATH}/cmd/manager + +# Build version and commit should be passed in when performing docker build +ARG VERSION=0.1.1 +ARG GIT_SHA=0000000 + +WORKDIR /src +COPY go.mod go.sum ./ +RUN go mod download + +COPY pkg ./ cmd ./ version ./ + +#RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o ${GOBIN}/${PROJECT_NAME} \ +# -ldflags "-X ${REPO_PATH}/version.Version=${VERSION} -X ${REPO_PATH}/version.GitSHA=${GIT_SHA}" \ +# $BUILD_PATH + +COPY . ./ +RUN apt-get install -y bash git make cmake gcc openssh-client openssh-server +RUN apt-get install -y libc-dev +RUN make build \ No newline at end of file diff --git a/pkg/controller/distributedrediscluster/sync_handler.go b/pkg/controller/distributedrediscluster/sync_handler.go index 9015ecd2a..0e646625e 100644 --- a/pkg/controller/distributedrediscluster/sync_handler.go +++ b/pkg/controller/distributedrediscluster/sync_handler.go @@ -2,6 +2,7 @@ package distributedrediscluster import ( "fmt" + "strconv" "time" "github.com/go-logr/logr" @@ -355,7 +356,7 @@ func (r *ReconcileDistributedRedisCluster) resetClusterPassword(ctx *syncContext // Update the password recorded in the file /data/redis_password, redis pod preStop hook // need /data/redis_password do CLUSTER FAILOVER cmd := fmt.Sprintf("echo %s > /data/redis_password", newPassword) - if err := r.execer.ExecCommandInPodSet(podSet, "/bin/sh", "-c", cmd); err != nil { + if err := r.execer.ExecCommandInPodSet(podSet, "/bin/sh", "-c", "-p", strconv.Itoa(ctx.cluster.Spec.ClientPort), cmd); err != nil { return err } diff --git a/pkg/controller/redisclusterbackup/sync_handler.go b/pkg/controller/redisclusterbackup/sync_handler.go index ceb867279..29d571c77 100644 --- a/pkg/controller/redisclusterbackup/sync_handler.go +++ b/pkg/controller/redisclusterbackup/sync_handler.go @@ -326,6 +326,7 @@ func (r *ReconcileRedisClusterBackup) backupContainers(backup *redisv1alpha1.Red fmt.Sprintf(`--data-dir=%s`, redisv1alpha1.BackupDumpDir), fmt.Sprintf(`--location=%s`, location), fmt.Sprintf(`--host=%s`, node.IP), + fmt.Sprintf(`--port=%s`, node.Port), fmt.Sprintf(`--folder=%s`, folderName), fmt.Sprintf(`--snapshot=%s-%d`, backup.Name, i), "--", diff --git a/pkg/resources/configmaps/configmap.go b/pkg/resources/configmaps/configmap.go index d6362f570..64f06fb08 100644 --- a/pkg/resources/configmaps/configmap.go +++ b/pkg/resources/configmaps/configmap.go @@ -31,9 +31,9 @@ failover() { echo "Slave: ${slave}" password=$(cat /data/redis_password) if [[ -z "${password}" ]]; then - redis-cli -h ${slave} CLUSTER FAILOVER + redis-cli -h ${slave} -p `+strconv.Itoa(cluster.Spec.ClientPort)+` CLUSTER FAILOVER else - redis-cli -h ${slave} -a "${password}" CLUSTER FAILOVER + redis-cli -h ${slave} -p `+strconv.Itoa(cluster.Spec.ClientPort)+` -a "${password}" CLUSTER FAILOVER fi echo "Wait for MASTER <-> SLAVE syncFinished" sleep 20 diff --git a/pkg/resources/statefulsets/statefulset.go b/pkg/resources/statefulsets/statefulset.go index 562443ee7..0f6c61e9c 100644 --- a/pkg/resources/statefulsets/statefulset.go +++ b/pkg/resources/statefulsets/statefulset.go @@ -243,7 +243,7 @@ func createContainerPort(name string, port int32, hostNetwork bool) corev1.Conta } func redisServerContainer(cluster *redisv1alpha1.DistributedRedisCluster, password *corev1.EnvVar, hostNetwork bool) corev1.Container { - probeArg := "redis-cli -h $(hostname) ping" + probeArg := "redis-cli -h $(hostname) -p " + strconv.Itoa(cluster.Spec.ClientPort) + " ping" container := corev1.Container{ Name: redisServerName, @@ -296,7 +296,7 @@ func redisServerContainer(cluster *redisv1alpha1.DistributedRedisCluster, passwo Lifecycle: &corev1.Lifecycle{ PostStart: &corev1.Handler{ Exec: &corev1.ExecAction{ - Command: []string{"/bin/sh", "-c", "echo ${REDIS_PASSWORD} > /data/redis_password"}, + Command: []string{"/bin/sh", "-p", strconv.Itoa(cluster.Spec.ClientPort), "-c", "echo ${REDIS_PASSWORD} > /data/redis_password"}, }, }, PreStop: &corev1.Handler{ From 54d0833027285f7d5d0a2ce2dc7ef7a474756f3f Mon Sep 17 00:00:00 2001 From: "angelopez.it" Date: Sun, 21 Feb 2021 17:47:35 +0100 Subject: [PATCH 09/16] remove default port --- hack/docker/redis-tools/redis-tools.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hack/docker/redis-tools/redis-tools.sh b/hack/docker/redis-tools/redis-tools.sh index 72fe704b8..6593ed602 100644 --- a/hack/docker/redis-tools/redis-tools.sh +++ b/hack/docker/redis-tools/redis-tools.sh @@ -23,7 +23,7 @@ show_help() { RETVAL=0 DEBUG=${DEBUG:-} REDIS_HOST=${REDIS_HOST:-} -REDIS_PORT=${REDIS_PORT:-6379} +REDIS_PORT=${REDIS_PORT:-} REDIS_USER=${REDIS_USER:-} REDIS_PASSWORD=${REDIS_PASSWORD:-} REDIS_BUCKET=${REDIS_BUCKET:-} From 9336f4d335f0de33797540322e5085df0484bbe1 Mon Sep 17 00:00:00 2001 From: "angelopez.it" Date: Sun, 21 Feb 2021 17:50:33 +0100 Subject: [PATCH 10/16] spread port from arguments the port. --- test/e2e/drc/drc_test.go | 12 ++++++------ test/e2e/drcb/drcb_test.go | 14 +++++++------- test/e2e/operator_util.go | 4 ++-- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/test/e2e/drc/drc_test.go b/test/e2e/drc/drc_test.go index 6b335adea..f26748d80 100644 --- a/test/e2e/drc/drc_test.go +++ b/test/e2e/drc/drc_test.go @@ -23,7 +23,7 @@ var _ = Describe("DistributedRedisCluster CRUD", func() { Ω(f.CreateRedisClusterPassword(f.PasswordName(), password)).Should(Succeed()) Ω(f.CreateRedisCluster(drc)).Should(Succeed()) Eventually(e2e.IsDistributedRedisClusterProperly(f, drc), "10m", "10s").ShouldNot(HaveOccurred()) - goredis = e2e.NewGoRedisClient(name, f.Namespace(), password) + goredis = e2e.NewGoRedisClient(name, f.Namespace(), password, 6379) Expect(goredis.StuffingData(10, 300000)).NotTo(HaveOccurred()) dbsize, err = goredis.DBSize() Expect(err).NotTo(HaveOccurred()) @@ -41,14 +41,14 @@ var _ = Describe("DistributedRedisCluster CRUD", func() { e2e.DeleteMasterPodForDRC(drc, f.Client) Eventually(e2e.IsDRCPodBeDeleted(f, drc), "5m", "10s").ShouldNot(HaveOccurred()) Eventually(e2e.IsDistributedRedisClusterProperly(f, drc), "10m", "10s").ShouldNot(HaveOccurred()) - goredis = e2e.NewGoRedisClient(drc.Name, f.Namespace(), goredis.Password()) + goredis = e2e.NewGoRedisClient(drc.Name, f.Namespace(), goredis.Password(), 6379) Expect(e2e.IsDBSizeConsistent(dbsize, goredis)).NotTo(HaveOccurred()) }) It("should scale up a DistributedRedisCluster", func() { e2e.ScaleUPDRC(drc) Ω(f.UpdateRedisCluster(drc)).Should(Succeed()) Eventually(e2e.IsDistributedRedisClusterProperly(f, drc), "10m", "10s").ShouldNot(HaveOccurred()) - goredis = e2e.NewGoRedisClient(drc.Name, f.Namespace(), goredis.Password()) + goredis = e2e.NewGoRedisClient(drc.Name, f.Namespace(), goredis.Password(), 6379) Expect(e2e.IsDBSizeConsistent(dbsize, goredis)).NotTo(HaveOccurred()) }) Context("when the scale up succeeded", func() { @@ -56,7 +56,7 @@ var _ = Describe("DistributedRedisCluster CRUD", func() { e2e.ScaleUPDown(drc) Ω(f.UpdateRedisCluster(drc)).Should(Succeed()) Eventually(e2e.IsDistributedRedisClusterProperly(f, drc), "10m", "10s").ShouldNot(HaveOccurred()) - goredis = e2e.NewGoRedisClient(drc.Name, f.Namespace(), goredis.Password()) + goredis = e2e.NewGoRedisClient(drc.Name, f.Namespace(), goredis.Password(), 6379) Expect(e2e.IsDBSizeConsistent(dbsize, goredis)).NotTo(HaveOccurred()) }) }) @@ -67,14 +67,14 @@ var _ = Describe("DistributedRedisCluster CRUD", func() { Ω(f.UpdateRedisCluster(drc)).Should(Succeed()) time.Sleep(5 * time.Second) Eventually(e2e.IsDistributedRedisClusterProperly(f, drc), "10m", "10s").ShouldNot(HaveOccurred()) - goredis = e2e.NewGoRedisClient(drc.Name, f.Namespace(), newPassword) + goredis = e2e.NewGoRedisClient(drc.Name, f.Namespace(), newPassword, 6379) Expect(e2e.IsDBSizeConsistent(dbsize, goredis)).NotTo(HaveOccurred()) }) It("should update the DistributedRedisCluster minor version", func() { e2e.RollingUpdateDRC(drc) Ω(f.UpdateRedisCluster(drc)).Should(Succeed()) Eventually(e2e.IsDistributedRedisClusterProperly(f, drc), "10m", "10s").ShouldNot(HaveOccurred()) - goredis = e2e.NewGoRedisClient(drc.Name, f.Namespace(), goredis.Password()) + goredis = e2e.NewGoRedisClient(drc.Name, f.Namespace(), goredis.Password(), 6379) Expect(e2e.IsDBSizeConsistent(dbsize, goredis)).NotTo(HaveOccurred()) }) }) diff --git a/test/e2e/drcb/drcb_test.go b/test/e2e/drcb/drcb_test.go index c04d785da..2a9405326 100644 --- a/test/e2e/drcb/drcb_test.go +++ b/test/e2e/drcb/drcb_test.go @@ -24,7 +24,7 @@ var _ = Describe("Restore DistributedRedisCluster From RedisClusterBackup", func Ω(f.CreateRedisClusterPassword(f.PasswordName(), password)).Should(Succeed()) Ω(f.CreateRedisCluster(drc)).Should(Succeed()) Eventually(e2e.IsDistributedRedisClusterProperly(f, drc), "10m", "10s").ShouldNot(HaveOccurred()) - goredis = e2e.NewGoRedisClient(name, f.Namespace(), password) + goredis = e2e.NewGoRedisClient(name, f.Namespace(), password, 6379) Expect(goredis.StuffingData(10, 300000)).NotTo(HaveOccurred()) dbsize, err = goredis.DBSize() Expect(err).NotTo(HaveOccurred()) @@ -50,7 +50,7 @@ var _ = Describe("Restore DistributedRedisCluster From RedisClusterBackup", func rdrc = e2e.RestoreDRC(drc, drcb) Ω(f.CreateRedisCluster(rdrc)).Should(Succeed()) Eventually(e2e.IsDistributedRedisClusterProperly(f, rdrc), "10m", "10s").ShouldNot(HaveOccurred()) - goredis = e2e.NewGoRedisClient(rdrc.Name, f.Namespace(), goredis.Password()) + goredis = e2e.NewGoRedisClient(rdrc.Name, f.Namespace(), goredis.Password(), 6379) Expect(e2e.IsDBSizeConsistent(dbsize, goredis)).NotTo(HaveOccurred()) }) Context("when restore is succeeded", func() { @@ -64,14 +64,14 @@ var _ = Describe("Restore DistributedRedisCluster From RedisClusterBackup", func e2e.DeleteMasterPodForDRC(rdrc, f.Client) Eventually(e2e.IsDRCPodBeDeleted(f, rdrc), "5m", "10s").ShouldNot(HaveOccurred()) Eventually(e2e.IsDistributedRedisClusterProperly(f, rdrc), "10m", "10s").ShouldNot(HaveOccurred()) - goredis = e2e.NewGoRedisClient(rdrc.Name, f.Namespace(), goredis.Password()) + goredis = e2e.NewGoRedisClient(rdrc.Name, f.Namespace(), goredis.Password(), 6379) Expect(e2e.IsDBSizeConsistent(dbsize, goredis)).NotTo(HaveOccurred()) }) It("should scale up a DistributedRedisCluster", func() { e2e.ScaleUPDRC(rdrc) Ω(f.UpdateRedisCluster(rdrc)).Should(Succeed()) Eventually(e2e.IsDistributedRedisClusterProperly(f, rdrc), "10m", "10s").ShouldNot(HaveOccurred()) - goredis = e2e.NewGoRedisClient(rdrc.Name, f.Namespace(), goredis.Password()) + goredis = e2e.NewGoRedisClient(rdrc.Name, f.Namespace(), goredis.Password(), 6379) Expect(e2e.IsDBSizeConsistent(dbsize, goredis)).NotTo(HaveOccurred()) }) Context("when the scale up succeeded", func() { @@ -79,7 +79,7 @@ var _ = Describe("Restore DistributedRedisCluster From RedisClusterBackup", func e2e.ScaleUPDown(rdrc) Ω(f.UpdateRedisCluster(rdrc)).Should(Succeed()) Eventually(e2e.IsDistributedRedisClusterProperly(f, rdrc), "10m", "10s").ShouldNot(HaveOccurred()) - goredis = e2e.NewGoRedisClient(rdrc.Name, f.Namespace(), goredis.Password()) + goredis = e2e.NewGoRedisClient(rdrc.Name, f.Namespace(), goredis.Password(), 6379) Expect(e2e.IsDBSizeConsistent(dbsize, goredis)).NotTo(HaveOccurred()) }) }) @@ -90,14 +90,14 @@ var _ = Describe("Restore DistributedRedisCluster From RedisClusterBackup", func Ω(f.UpdateRedisCluster(rdrc)).Should(Succeed()) time.Sleep(5 * time.Second) Eventually(e2e.IsDistributedRedisClusterProperly(f, rdrc), "10m", "10s").ShouldNot(HaveOccurred()) - goredis = e2e.NewGoRedisClient(rdrc.Name, f.Namespace(), newPassword) + goredis = e2e.NewGoRedisClient(rdrc.Name, f.Namespace(), newPassword, 6379) Expect(e2e.IsDBSizeConsistent(dbsize, goredis)).NotTo(HaveOccurred()) }) It("should update the DistributedRedisCluster minor version", func() { e2e.RollingUpdateDRC(rdrc) Ω(f.UpdateRedisCluster(rdrc)).Should(Succeed()) Eventually(e2e.IsDistributedRedisClusterProperly(f, rdrc), "10m", "10s").ShouldNot(HaveOccurred()) - goredis = e2e.NewGoRedisClient(rdrc.Name, f.Namespace(), goredis.Password()) + goredis = e2e.NewGoRedisClient(rdrc.Name, f.Namespace(), goredis.Password(), 6379) Expect(e2e.IsDBSizeConsistent(dbsize, goredis)).NotTo(HaveOccurred()) }) }) diff --git a/test/e2e/operator_util.go b/test/e2e/operator_util.go index b4efbb73d..18e67e0aa 100644 --- a/test/e2e/operator_util.go +++ b/test/e2e/operator_util.go @@ -368,8 +368,8 @@ func IsRedisClusterBackupProperly(f *Framework, drcb *redisv1alpha1.RedisCluster } } -func NewGoRedisClient(svc, namespaces, password string) *GoRedis { - addr := fmt.Sprintf("%s.%s.svc.%s:6379", svc, namespaces, os.Getenv("CLUSTER_DOMAIN")) +func NewGoRedisClient(svc, namespaces, password string, port int) *GoRedis { + addr := fmt.Sprintf("%s.%s.svc.%s:%d", svc, namespaces, os.Getenv("CLUSTER_DOMAIN"), port) return NewGoRedis(addr, password) } From 7f6f520b65d71543f7136f661543c6db7d470e85 Mon Sep 17 00:00:00 2001 From: "angelopez.it" Date: Sun, 21 Feb 2021 18:13:19 +0100 Subject: [PATCH 11/16] expose also monitor prometheus port when using hostnetwork. --- pkg/resources/statefulsets/statefulset.go | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/pkg/resources/statefulsets/statefulset.go b/pkg/resources/statefulsets/statefulset.go index 0f6c61e9c..b326094b1 100644 --- a/pkg/resources/statefulsets/statefulset.go +++ b/pkg/resources/statefulsets/statefulset.go @@ -68,7 +68,7 @@ func NewStatefulSetForCR(cluster *redisv1alpha1.DistributedRedisCluster, ssName, SecurityContext: spec.SecurityContext, NodeSelector: cluster.Spec.NodeSelector, Containers: []corev1.Container{ - redisServerContainer(cluster, password, spec.HostNetwork), + redisServerContainer(cluster, password), }, Volumes: volumes, HostNetwork: spec.HostNetwork, @@ -242,7 +242,7 @@ func createContainerPort(name string, port int32, hostNetwork bool) corev1.Conta return containerPort } -func redisServerContainer(cluster *redisv1alpha1.DistributedRedisCluster, password *corev1.EnvVar, hostNetwork bool) corev1.Container { +func redisServerContainer(cluster *redisv1alpha1.DistributedRedisCluster, password *corev1.EnvVar) corev1.Container { probeArg := "redis-cli -h $(hostname) -p " + strconv.Itoa(cluster.Spec.ClientPort) + " ping" container := corev1.Container{ @@ -250,8 +250,8 @@ func redisServerContainer(cluster *redisv1alpha1.DistributedRedisCluster, passwo Image: cluster.Spec.Image, ImagePullPolicy: cluster.Spec.ImagePullPolicy, Ports: []corev1.ContainerPort{ - createContainerPort("client", int32(cluster.Spec.ClientPort), hostNetwork), - createContainerPort("gossip", int32(cluster.Spec.GossipPort), hostNetwork), + createContainerPort("client", int32(cluster.Spec.ClientPort), cluster.Spec.HostNetwork), + createContainerPort("gossip", int32(cluster.Spec.GossipPort), cluster.Spec.HostNetwork), }, VolumeMounts: volumeMounts(), Command: getRedisCommand(cluster, password), @@ -325,12 +325,9 @@ func redisExporterContainer(cluster *redisv1alpha1.DistributedRedisCluster, pass }, cluster.Spec.Monitor.Args...), Image: cluster.Spec.Monitor.Image, ImagePullPolicy: corev1.PullAlways, + Ports: []corev1.ContainerPort{ - { - Name: "prom-http", - Protocol: corev1.ProtocolTCP, - ContainerPort: cluster.Spec.Monitor.Prometheus.Port, - }, + createContainerPort("prom-http", cluster.Spec.Monitor.Prometheus.Port, cluster.Spec.HostNetwork), }, Env: cluster.Spec.Monitor.Env, Resources: cluster.Spec.Monitor.Resources, From 4731615dcdd64fae1a651c1457fd9bdbc6359cc4 Mon Sep 17 00:00:00 2001 From: "angelopez.it" Date: Mon, 22 Feb 2021 15:45:09 +0100 Subject: [PATCH 12/16] remove -p from non redis-cli command --- pkg/resources/statefulsets/statefulset.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/resources/statefulsets/statefulset.go b/pkg/resources/statefulsets/statefulset.go index 8d0338f21..c6a7a6b04 100644 --- a/pkg/resources/statefulsets/statefulset.go +++ b/pkg/resources/statefulsets/statefulset.go @@ -297,7 +297,7 @@ func redisServerContainer(cluster *redisv1alpha1.DistributedRedisCluster, passwo Lifecycle: &corev1.Lifecycle{ PostStart: &corev1.Handler{ Exec: &corev1.ExecAction{ - Command: []string{"/bin/sh", "-p", strconv.Itoa(cluster.Spec.ClientPort), "-c", "echo ${REDIS_PASSWORD} > /data/redis_password"}, + Command: []string{"/bin/sh", "-c", "echo ${REDIS_PASSWORD} > /data/redis_password"}, }, }, PreStop: &corev1.Handler{ From b0f468c2dacc05cba6711b1063cbc564a6726a7a Mon Sep 17 00:00:00 2001 From: "angelopez.it" Date: Mon, 22 Feb 2021 15:47:32 +0100 Subject: [PATCH 13/16] remove -p from non redis-cli command --- pkg/controller/distributedrediscluster/sync_handler.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/controller/distributedrediscluster/sync_handler.go b/pkg/controller/distributedrediscluster/sync_handler.go index 0e646625e..9015ecd2a 100644 --- a/pkg/controller/distributedrediscluster/sync_handler.go +++ b/pkg/controller/distributedrediscluster/sync_handler.go @@ -2,7 +2,6 @@ package distributedrediscluster import ( "fmt" - "strconv" "time" "github.com/go-logr/logr" @@ -356,7 +355,7 @@ func (r *ReconcileDistributedRedisCluster) resetClusterPassword(ctx *syncContext // Update the password recorded in the file /data/redis_password, redis pod preStop hook // need /data/redis_password do CLUSTER FAILOVER cmd := fmt.Sprintf("echo %s > /data/redis_password", newPassword) - if err := r.execer.ExecCommandInPodSet(podSet, "/bin/sh", "-c", "-p", strconv.Itoa(ctx.cluster.Spec.ClientPort), cmd); err != nil { + if err := r.execer.ExecCommandInPodSet(podSet, "/bin/sh", "-c", cmd); err != nil { return err } From a82e83c630c3cfae7066cec74b87072a6977f20e Mon Sep 17 00:00:00 2001 From: "angelopez.it" Date: Wed, 24 Mar 2021 08:12:22 +0100 Subject: [PATCH 14/16] delete again check of min number of replicas as original code has --- pkg/apis/redis/v1alpha1/default.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/pkg/apis/redis/v1alpha1/default.go b/pkg/apis/redis/v1alpha1/default.go index 1675384cf..1583e0c21 100644 --- a/pkg/apis/redis/v1alpha1/default.go +++ b/pkg/apis/redis/v1alpha1/default.go @@ -26,11 +26,6 @@ func (in *DistributedRedisCluster) DefaultSpec(log logr.Logger) bool { update = true } - if in.Spec.ClusterReplicas < minClusterReplicas { - in.Spec.ClusterReplicas = minClusterReplicas - update = true - } - if in.Spec.ClientPort == 0 { in.Spec.ClientPort = defaultClientPort update = true From ec08b99b04a1ed735c1d1796db4f4674eb3df85e Mon Sep 17 00:00:00 2001 From: angelopez Date: Mon, 11 Apr 2022 07:59:29 +0200 Subject: [PATCH 15/16] use directly osm --- hack/docker/redis-tools/redis-tools.sh | 2 +- pkg/osm/osm.go | 111 +++++++++++++------------ 2 files changed, 59 insertions(+), 54 deletions(-) diff --git a/hack/docker/redis-tools/redis-tools.sh b/hack/docker/redis-tools/redis-tools.sh index 6593ed602..72fe704b8 100644 --- a/hack/docker/redis-tools/redis-tools.sh +++ b/hack/docker/redis-tools/redis-tools.sh @@ -23,7 +23,7 @@ show_help() { RETVAL=0 DEBUG=${DEBUG:-} REDIS_HOST=${REDIS_HOST:-} -REDIS_PORT=${REDIS_PORT:-} +REDIS_PORT=${REDIS_PORT:-6379} REDIS_USER=${REDIS_USER:-} REDIS_PASSWORD=${REDIS_PASSWORD:-} REDIS_BUCKET=${REDIS_BUCKET:-} diff --git a/pkg/osm/osm.go b/pkg/osm/osm.go index 988185627..c1ca22336 100644 --- a/pkg/osm/osm.go +++ b/pkg/osm/osm.go @@ -35,7 +35,6 @@ import ( const ( SecretMountPath = "/etc/rclone" - CaCertFileName = "ca.crt" ) func CheckBucketAccess(client client.Client, spec api.Backend, namespace string) error { @@ -80,69 +79,75 @@ func NewOSMContext(client client.Client, spec api.Backend, namespace string) (*o if spec.S3 != nil { nc.Provider = s3.Kind - keyID, foundKeyID := config[awsconst.AWS_ACCESS_KEY_ID] key, foundKey := config[awsconst.AWS_SECRET_ACCESS_KEY] - if foundKey && foundKeyID { + if spec.S3.Endpoint == "" || spec.S3.Endpoint == "osm" { nc.Config[s3.ConfigAccessKeyID] = string(keyID) nc.Config[s3.ConfigSecretKey] = string(key) nc.Config[s3.ConfigAuthType] = "accesskey" + nc.Config[s3.ConfigRegion] = spec.S3.Region } else { - nc.Config[s3.ConfigAuthType] = "iam" - } - if spec.S3.Endpoint == "" || strings.HasSuffix(spec.S3.Endpoint, ".amazonaws.com") { - // Using s3 and not s3-compatible service like minio or rook, etc. Now, find region - var sess *session.Session - var err error - if nc.Config[s3.ConfigAuthType] == "iam" { - // The aws sdk does not currently support automatically setting the region based on an instances placement. - // This automatically sets region based on ec2 instance metadata when running on EC2. - // ref: https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-region.html#setting-region-order-of-precedence - var c aws.Config - if s, e := session.NewSession(); e == nil { - if region, e := ec2metadata.New(s).Region(); e == nil { - c.WithRegion(region) + if foundKey && foundKeyID { + nc.Config[s3.ConfigAccessKeyID] = string(keyID) + nc.Config[s3.ConfigSecretKey] = string(key) + nc.Config[s3.ConfigAuthType] = "accesskey" + } else { + nc.Config[s3.ConfigAuthType] = "iam" + } + if spec.S3.Endpoint == "" || strings.HasSuffix(spec.S3.Endpoint, ".amazonaws.com") { + // Using s3 and not s3-compatible service like minio or rook, etc. Now, find region + var sess *session.Session + var err error + if nc.Config[s3.ConfigAuthType] == "iam" { + // The aws sdk does not currently support automatically setting the region based on an instances placement. + // This automatically sets region based on ec2 instance metadata when running on EC2. + // ref: https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-region.html#setting-region-order-of-precedence + var c aws.Config + if s, e := session.NewSession(); e == nil { + if region, e := ec2metadata.New(s).Region(); e == nil { + c.WithRegion(region) + } } + sess, err = session.NewSessionWithOptions(session.Options{ + Config: c, + // Support MFA when authing using assumed roles. + SharedConfigState: session.SharedConfigEnable, + AssumeRoleTokenProvider: stscreds.StdinTokenProvider, + }) + } else { + sess, err = session.NewSessionWithOptions(session.Options{ + Config: aws.Config{ + Credentials: credentials.NewStaticCredentials(string(keyID), string(key), ""), + Region: aws.String("us-east-1"), + }, + // Support MFA when authing using assumed roles. + SharedConfigState: session.SharedConfigEnable, + AssumeRoleTokenProvider: stscreds.StdinTokenProvider, + }) } - sess, err = session.NewSessionWithOptions(session.Options{ - Config: c, - // Support MFA when authing using assumed roles. - SharedConfigState: session.SharedConfigEnable, - AssumeRoleTokenProvider: stscreds.StdinTokenProvider, + if err != nil { + return nil, err + } + svc := _s3.New(sess) + out, err := svc.GetBucketLocation(&_s3.GetBucketLocationInput{ + Bucket: types.StringP(spec.S3.Bucket), }) + if err != nil { + return nil, err + } + nc.Config[s3.ConfigRegion] = stringz.Val(types.String(out.LocationConstraint), "us-east-1") } else { - sess, err = session.NewSessionWithOptions(session.Options{ - Config: aws.Config{ - Credentials: credentials.NewStaticCredentials(string(keyID), string(key), ""), - Region: aws.String("us-east-1"), - }, - // Support MFA when authing using assumed roles. - SharedConfigState: session.SharedConfigEnable, - AssumeRoleTokenProvider: stscreds.StdinTokenProvider, - }) - } - if err != nil { - return nil, err - } - svc := _s3.New(sess) - out, err := svc.GetBucketLocation(&_s3.GetBucketLocationInput{ - Bucket: types.StringP(spec.S3.Bucket), - }) - if err != nil { - return nil, err - } - nc.Config[s3.ConfigRegion] = stringz.Val(types.String(out.LocationConstraint), "us-east-1") - } else { - nc.Config[s3.ConfigEndpoint] = spec.S3.Endpoint - u, err := url.Parse(spec.S3.Endpoint) - if err != nil { - return nil, err - } - nc.Config[s3.ConfigDisableSSL] = strconv.FormatBool(u.Scheme == "http") + nc.Config[s3.ConfigEndpoint] = spec.S3.Endpoint + u, err := url.Parse(spec.S3.Endpoint) + if err != nil { + return nil, err + } + nc.Config[s3.ConfigDisableSSL] = strconv.FormatBool(u.Scheme == "http") - cacertData, ok := config[awsconst.CA_CERT_DATA] - if ok && u.Scheme == "https" { - nc.Config[s3.ConfigCACertData] = string(cacertData) + cacertData, ok := config[awsconst.CA_CERT_DATA] + if ok && u.Scheme == "https" { + nc.Config[s3.ConfigCACertData] = string(cacertData) + } } } return nc, nil From 5bc679df5877c5d00955baafd7a5e28be6ba3d8f Mon Sep 17 00:00:00 2001 From: angelopez Date: Mon, 11 Apr 2022 08:03:55 +0200 Subject: [PATCH 16/16] restore deleted const --- pkg/osm/osm.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/osm/osm.go b/pkg/osm/osm.go index c1ca22336..c35f3bda3 100644 --- a/pkg/osm/osm.go +++ b/pkg/osm/osm.go @@ -35,6 +35,7 @@ import ( const ( SecretMountPath = "/etc/rclone" + CaCertFileName = "ca.crt" ) func CheckBucketAccess(client client.Client, spec api.Backend, namespace string) error {