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:
52
cmd/etcd.go
52
cmd/etcd.go
@@ -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{}
|
||||
|
Reference in New Issue
Block a user