1
0
mirror of https://github.com/rancher/rke.git synced 2025-06-25 15:01:58 +00:00
rke/cluster/etcd.go

63 lines
2.0 KiB
Go
Raw Normal View History

2018-05-09 17:39:19 +00:00
package cluster
import (
"context"
"fmt"
2018-11-24 10:18:24 +00:00
"github.com/rancher/rke/log"
2018-05-09 17:39:19 +00:00
"github.com/rancher/rke/services"
)
2018-05-17 22:27:35 +00:00
func (c *Cluster) SnapshotEtcd(ctx context.Context, snapshotName string) error {
2018-05-09 17:39:19 +00:00
for _, host := range c.EtcdHosts {
if err := services.RunEtcdSnapshotSave(ctx, host, c.PrivateRegistriesMap, c.SystemImages.Alpine, snapshotName, true, c.Services.Etcd); err != nil {
2018-05-09 17:39:19 +00:00
return err
}
}
return nil
}
2018-05-17 22:27:35 +00:00
func (c *Cluster) RestoreEtcdSnapshot(ctx context.Context, snapshotPath string) error {
// get etcd snapshots from s3 if backup backend server is set
if c.Services.Etcd.BackupConfig != nil && c.Services.Etcd.BackupConfig.S3BackupConfig != nil {
for _, host := range c.EtcdHosts {
if err := services.DownloadEtcdSnapshot(ctx, host, c.PrivateRegistriesMap, c.SystemImages.Alpine, snapshotPath, c.Services.Etcd); err != nil {
return err
}
}
}
2018-11-24 10:18:24 +00:00
if isEqual := c.etcdSnapshotChecksum(ctx, snapshotPath); !isEqual {
return fmt.Errorf("etcd snapshots are not consistent")
2018-05-09 17:39:19 +00:00
}
2018-05-09 17:39:19 +00:00
// Start restore process on all etcd hosts
initCluster := services.GetEtcdInitialCluster(c.EtcdHosts)
for _, host := range c.EtcdHosts {
2018-05-17 22:27:35 +00:00
if err := services.RestoreEtcdSnapshot(ctx, host, c.PrivateRegistriesMap, c.SystemImages.Etcd, snapshotPath, initCluster); err != nil {
return fmt.Errorf("[etcd] Failed to restore etcd snapshot: %v", err)
2018-05-09 17:39:19 +00:00
}
}
return nil
}
2018-11-24 10:18:24 +00:00
func (c *Cluster) etcdSnapshotChecksum(ctx context.Context, snapshotPath string) bool {
log.Infof(ctx, "[etcd] Checking if all snapshots are identical")
etcdChecksums := []string{}
for _, etcdHost := range c.EtcdHosts {
checksum, err := services.GetEtcdSnapshotChecksum(ctx, etcdHost, c.PrivateRegistriesMap, c.SystemImages.Alpine, snapshotPath)
if err != nil {
return false
}
etcdChecksums = append(etcdChecksums, checksum)
log.Infof(ctx, "[etcd] Checksum of etcd snapshot on host [%s] is [%s]", etcdHost.Address, checksum)
2018-05-09 17:39:19 +00:00
}
2018-11-24 10:18:24 +00:00
hostChecksum := etcdChecksums[0]
for _, checksum := range etcdChecksums {
if checksum != hostChecksum {
return false
}
2018-05-09 17:39:19 +00:00
}
2018-11-24 10:18:24 +00:00
return true
2018-05-09 17:39:19 +00:00
}