/* * RHQ Management Platform * Copyright (C) 2005-2008 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.enterprise.server.cloud; import java.util.ArrayList; import java.util.List; import org.rhq.core.domain.cloud.AffinityGroup; import org.rhq.core.domain.cloud.Server; import org.rhq.core.domain.cloud.composite.FailoverListComposite.ServerEntry; import org.rhq.core.domain.resource.Agent; public class ServerBucket { Server server; ServerEntry serverEntry; int computePower; double assignedLoad; List<Agent> assignedAgents; ServerBucket(Server server) { this.server = server; this.serverEntry = server.getServerEntry(); // TODO get the computePower from the server this.computePower = 1; this.assignedLoad = 0.0; assignedAgents = new ArrayList<Agent>(); } @Override public String toString() { return serverEntry.toString(); } static ServerBucket getBestBucket(List<ServerBucket> buckets, List<ServerBucket> usedBuckets, AffinityGroup affinityGroup, String preferredServerName) { ServerBucket result = null; // if the preferred server is available and does not break affinity, use it if ((null != preferredServerName) && (null == ServerBucket.getBucketByName(usedBuckets, preferredServerName))) { result = ServerBucket.getBucketByName(buckets, preferredServerName); if ((null != result) && (null != affinityGroup) && (!affinityGroup.equals(result.server.getAffinityGroup()))) { result = null; } } if (null != result) return result; for (ServerBucket next : buckets) { if (null == ServerBucket.getBucketByName(usedBuckets, next.server.getName())) { if (null == result) { // start with the first available candidate result = next; continue; } if (null == affinityGroup) { if (next.assignedLoad < result.assignedLoad) { result = next; } continue; } // affinity logic if (!affinityGroup.equals(result.server.getAffinityGroup())) { // always prefer affinity if (affinityGroup.equals(next.server.getAffinityGroup())) { result = next; } else if (next.assignedLoad < result.assignedLoad) { result = next; } } else if (affinityGroup.equals(next.server.getAffinityGroup()) && (next.assignedLoad < result.assignedLoad)) { // if affinity is satisfied and assigned load is preferable, use this candidate result = next; } } } return result; } static ServerBucket getBucketByName(List<ServerBucket> buckets, String serverName) { for (ServerBucket next : buckets) { if (next.server.getName().equals(serverName)) return next; } return null; } }