// replaceCommandPlaceholders replaxces agreed-upon placeholders with analysis data func replaceCommandPlaceholders(command string, analysisEntry inst.ReplicationAnalysis, successorInstance *inst.Instance) string { command = strings.Replace(command, "{failureType}", string(analysisEntry.Analysis), -1) command = strings.Replace(command, "{failureDescription}", analysisEntry.Description, -1) command = strings.Replace(command, "{failedHost}", analysisEntry.AnalyzedInstanceKey.Hostname, -1) command = strings.Replace(command, "{failedPort}", fmt.Sprintf("%d", analysisEntry.AnalyzedInstanceKey.Port), -1) command = strings.Replace(command, "{failureCluster}", analysisEntry.ClusterDetails.ClusterName, -1) command = strings.Replace(command, "{failureClusterAlias}", analysisEntry.ClusterDetails.ClusterAlias, -1) command = strings.Replace(command, "{countSlaves}", fmt.Sprintf("%d", analysisEntry.CountSlaves), -1) command = strings.Replace(command, "{isDowntimed}", fmt.Sprint(analysisEntry.IsDowntimed), -1) command = strings.Replace(command, "{orchestratorHost}", ThisHostname, -1) if successorInstance != nil { command = strings.Replace(command, "{successorHost}", successorInstance.Key.Hostname, -1) command = strings.Replace(command, "{successorPort}", fmt.Sprintf("%d", successorInstance.Key.Port), -1) } command = strings.Replace(command, "{slaveHosts}", analysisEntry.GetSlaveHostsAsString(), -1) return command }
// AttemptRecoveryRegistration tries to add a recovery entry; if this fails that means recovery is already in place. func AttemptRecoveryRegistration(analysisEntry *inst.ReplicationAnalysis) (bool, error) { db, err := db.OpenOrchestrator() if err != nil { return false, log.Errore(err) } sqlResult, err := sqlutils.Exec(db, ` insert ignore into topology_recovery ( hostname, port, in_active_period, start_active_period, end_active_period_unixtime, processing_node_hostname, processcing_node_token, analysis, cluster_name, cluster_alias, count_affected_slaves, slave_hosts ) values ( ?, ?, 1, NOW(), 0, ?, ?, ?, ?, ?, ?, ? ) `, analysisEntry.AnalyzedInstanceKey.Hostname, analysisEntry.AnalyzedInstanceKey.Port, ThisHostname, ProcessToken.Hash, string(analysisEntry.Analysis), analysisEntry.ClusterDetails.ClusterName, analysisEntry.ClusterDetails.ClusterAlias, analysisEntry.CountSlaves, analysisEntry.GetSlaveHostsAsString(), ) if err != nil { return false, log.Errore(err) } rows, err := sqlResult.RowsAffected() return (err == nil && rows > 0), err }