public MigrationPlan ReleaseLowloadedMachines(IEnumerable <Server> targets, IEnumerable <Server> recieversCandidates) // TODO: Migration Res consider too late { var migrationPlan = new MigrationPlan(); var targetsCopies = recieversCandidates.Select(s => s.Copy()) .OrderBy(s => s.ResourcesCapacity.GetValue()) .ThenBy(s => s.RunningVMs.Count) .ThenBy(s => s.UsedResources.GetValue() / s.RunningVMs.Count) .ToList(); var recievers = targetsCopies.Where(server => server.TurnedOn); foreach (var server in targets) { var resultNode = _searchEngine.Run( new MigrationRootNode( server, recievers.ToList(), new List <Server>(), // empty reserve because we are decreasing amount of working servers GetInitialValue(recievers, EvaluateForReleasing), LowloadedMigrationNode.FromRootNode) ) as MigrationNode; if (resultNode == null || !resultNode.IsValid) // apply migration only if all VM is going to migrate { break; } migrationPlan.Add(resultNode, server); foreach (var change in resultNode.Changes) { var reciever = targetsCopies.Find(s => s.Id == change.Reciever.Id); reciever.AsignVM(change.Target); reciever.UsedResources += server.GetMigrationResourceRequirments(reciever); } } return(migrationPlan); }
public MigrationPlan MigrateFromOverloaded(IEnumerable <Server> targets, IEnumerable <Server> recievers) { var migrationPlan = new MigrationPlan(); var targetsCopies = recievers.Select(s => s.Copy()) .OrderBy(s => s.ResourcesCapacity.GetValue()) .ThenBy(s => s.RunningVMs.Count) .ThenBy(s => s.UsedResources.GetValue() / s.RunningVMs.Count) .ToList(); var priorityRecievers = targetsCopies.Where(server => server.TurnedOn); var reserve = targetsCopies.Where(server => !server.TurnedOn); foreach (var server in targets) { var resultNode = _searchEngine.Run( new MigrationRootNode( server, priorityRecievers.ToList(), reserve.ToList(), GetInitialValue(priorityRecievers, EvaluateForOverloading), OverloadedMigrationNode.FromRootNode) ) as MigrationNode; if (resultNode == null) { break; } migrationPlan.Add(resultNode, server); // TODO: reconsider foreach (var change in resultNode.Changes) { var srv = targetsCopies.Find(s => s.Id == change.Reciever.Id); srv.AsignVM(change.Target); srv.UsedResources += server.GetMigrationResourceRequirments(srv); } } return(migrationPlan); }