1
0
mirror of https://github.com/rancher/rke.git synced 2025-09-16 15:10:12 +00:00

Able to include and extract state file in snapshot

This commit is contained in:
Sebastiaan van Steenis
2020-03-30 21:16:47 +02:00
parent e2b5828e5b
commit 9bca29befb
8 changed files with 161 additions and 10 deletions

View File

@@ -107,6 +107,10 @@ func SnapshotSaveEtcdHosts(
flags cluster.ExternalFlags, snapshotName string) error {
log.Infof(ctx, "Starting saving snapshot on etcd hosts")
stateFilePath := cluster.GetStateFilePath(flags.ClusterFilePath, flags.ConfigDir)
rkeFullState, _ := cluster.ReadStateFile(ctx, stateFilePath)
kubeCluster, err := cluster.InitClusterObject(ctx, rkeConfig, flags, "")
if err != nil {
return err
@@ -119,6 +123,10 @@ func SnapshotSaveEtcdHosts(
return err
}
if err := kubeCluster.DeployStateFile(ctx, rkeFullState, snapshotName); err != nil {
return err
}
if err := kubeCluster.SnapshotEtcd(ctx, snapshotName); err != nil {
return err
}
@@ -135,10 +143,43 @@ func RestoreEtcdSnapshot(
data map[string]interface{},
snapshotName string) (string, string, string, string, map[string]pki.CertificatePKI, error) {
var APIURL, caCrt, clientCert, clientKey string
log.Infof(ctx, "Restoring etcd snapshot %s", snapshotName)
log.Infof(ctx, "Checking if state file is included in snapshot file for %s", snapshotName)
// Creating temp cluster to check if snapshot archive contains statefile and retrieve it
tempCluster, err := cluster.InitClusterObject(ctx, rkeConfig, flags, "")
if err != nil {
return APIURL, caCrt, clientCert, clientKey, nil, err
}
if err := tempCluster.SetupDialers(ctx, dialersOptions); err != nil {
return APIURL, caCrt, clientCert, clientKey, nil, err
}
if err := tempCluster.TunnelHosts(ctx, flags); err != nil {
return APIURL, caCrt, clientCert, clientKey, nil, err
}
rkeFullState := &cluster.FullState{}
stateFileRetrieved := false
// Local state file
stateFilePath := cluster.GetStateFilePath(flags.ClusterFilePath, flags.ConfigDir)
rkeFullState, _ := cluster.ReadStateFile(ctx, stateFilePath)
// Extract state file from snapshot
stateFile, err := tempCluster.GetStateFileFromSnapshot(ctx, snapshotName)
// If state file is not in snapshot (or can't be retrieved), fallback to local state file
if err != nil {
logrus.Infof("Could not extract state file from snapshot [%s] on any host, falling back to local state file: %v", snapshotName, err)
rkeFullState, _ = cluster.ReadStateFile(ctx, stateFilePath)
} else {
// Parse extracted statefile to FullState struct
rkeFullState, err = cluster.StringToFullState(ctx, stateFile)
if err != nil {
logrus.Errorf("Error when converting state file contents to rkeFullState: %v", err)
return APIURL, caCrt, clientCert, clientKey, nil, err
}
logrus.Infof("State file is successfully extracted from snapshot [%s]", snapshotName)
stateFileRetrieved = true
}
log.Infof(ctx, "Restoring etcd snapshot %s", snapshotName)
kubeCluster, err := cluster.InitClusterObject(ctx, rkeConfig, flags, rkeFullState.DesiredState.EncryptionConfig)
if err != nil {
@@ -149,8 +190,11 @@ func RestoreEtcdSnapshot(
return APIURL, caCrt, clientCert, clientKey, nil, err
}
if err := checkLegacyCluster(ctx, kubeCluster, rkeFullState, flags); err != nil {
return APIURL, caCrt, clientCert, clientKey, nil, err
// If we can't retrieve statefile from snapshot, and we don't have local, we need to check for legacy cluster
if !stateFileRetrieved {
if err := checkLegacyCluster(ctx, kubeCluster, rkeFullState, flags); err != nil {
return APIURL, caCrt, clientCert, clientKey, nil, err
}
}
rkeFullState.CurrentState = cluster.State{}