func NewTopologyRecovery(replicationAnalysis inst.ReplicationAnalysis) *TopologyRecovery { topologyRecovery := &TopologyRecovery{} topologyRecovery.AnalysisEntry = replicationAnalysis topologyRecovery.SuccessorKey = nil topologyRecovery.LostSlaves = *inst.NewInstanceKeyMap() topologyRecovery.ParticipatingInstanceKeys = *inst.NewInstanceKeyMap() topologyRecovery.AllErrors = []string{} topologyRecovery.PostponedFunctions = [](func() error){} return topologyRecovery }
// replaceCommandPlaceholders replaxces agreed-upon placeholders with analysis data func replaceCommandPlaceholders(command string, analysisEntry inst.ReplicationAnalysis, successorInstance *inst.Instance, lostSlaves [](*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, "{autoMasterRecovery}", fmt.Sprint(analysisEntry.ClusterDetails.HasAutomatedMasterRecovery), -1) command = strings.Replace(command, "{autoIntermediateMasterRecovery}", fmt.Sprint(analysisEntry.ClusterDetails.HasAutomatedIntermediateMasterRecovery), -1) command = strings.Replace(command, "{orchestratorHost}", process.ThisHostname, -1) command = strings.Replace(command, "{isSuccessful}", fmt.Sprint(successorInstance != nil), -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) } lostSlavesKeyMap := inst.NewInstanceKeyMap() lostSlavesKeyMap.AddInstances(lostSlaves) command = strings.Replace(command, "{lostSlaves}", lostSlavesKeyMap.ToCommaDelimitedList(), -1) command = strings.Replace(command, "{slaveHosts}", analysisEntry.SlaveHosts.ToCommaDelimitedList(), -1) return command }
func (s *TestSuite) TestInstanceKeyMapReadJSON(c *C) { json := `[{"Hostname":"host1","Port":3306},{"Hostname":"host2","Port":3306}]` m := *inst.NewInstanceKeyMap() m.ReadJson(json) c.Assert(len(m), Equals, 2) c.Assert(m[key1], Equals, true) c.Assert(m[key2], Equals, true) }
func (s *TestSuite) TestInstanceKeyMapToCommaDelimitedList(c *C) { m := *inst.NewInstanceKeyMap() m.AddKey(key1) m.AddKey(key2) res := m.ToCommaDelimitedList() ok := (res == `host1:3306,host2:3306`) || (res == `host2:3306,host1:3306`) c.Assert(ok, Equals, true) }
func (s *TestSuite) TestInstanceKeyMapToJSON(c *C) { m := *inst.NewInstanceKeyMap() m.AddKey(key1) m.AddKey(key2) json, err := m.ToJSON() c.Assert(err, IsNil) ok := (json == `[{"Hostname":"host1","Port":3306},{"Hostname":"host2","Port":3306}]`) || (json == `[{"Hostname":"host2","Port":3306},{"Hostname":"host1","Port":3306}]`) c.Assert(ok, Equals, true) }
func (s *TestSuite) TestEmptyInstanceKeyMapToCommaDelimitedList(c *C) { m := *inst.NewInstanceKeyMap() res := m.ToCommaDelimitedList() c.Assert(res, Equals, "") }