modules/enterprise/server/plugins/cloud/src/main/java/org/rhq/enterprise/server/plugins/cloud/CloudServerPluginComponent.java | 60 +++++++++- modules/enterprise/server/plugins/cloud/src/main/resources/META-INF/rhq-serverplugin.xml | 15 ++ 2 files changed, 69 insertions(+), 6 deletions(-)
New commits: commit 45633060e9a2c1cfb7c4d30845b7cac97f6a7c8b Author: John Sanda jsanda@redhat.com Date: Thu Sep 23 17:52:57 2010 -0400
Exposing address sync job as an operation that can be manually invoked.
This is a first code at this plugin operation. Some error handling needs to be added along with some logging.
diff --git a/modules/enterprise/server/plugins/cloud/src/main/java/org/rhq/enterprise/server/plugins/cloud/CloudServerPluginComponent.java b/modules/enterprise/server/plugins/cloud/src/main/java/org/rhq/enterprise/server/plugins/cloud/CloudServerPluginComponent.java index 233436d..796f035 100644 --- a/modules/enterprise/server/plugins/cloud/src/main/java/org/rhq/enterprise/server/plugins/cloud/CloudServerPluginComponent.java +++ b/modules/enterprise/server/plugins/cloud/src/main/java/org/rhq/enterprise/server/plugins/cloud/CloudServerPluginComponent.java @@ -16,12 +16,14 @@ import org.rhq.core.domain.resource.Resource; import org.rhq.enterprise.server.auth.SubjectManagerLocal; import org.rhq.enterprise.server.cloud.CloudManagerLocal; import org.rhq.enterprise.server.operation.OperationManagerLocal; +import org.rhq.enterprise.server.plugin.pc.ControlFacet; +import org.rhq.enterprise.server.plugin.pc.ControlResults; import org.rhq.enterprise.server.plugin.pc.ScheduledJobInvocationContext; import org.rhq.enterprise.server.plugin.pc.ServerPluginComponent; import org.rhq.enterprise.server.plugin.pc.ServerPluginContext; import org.rhq.enterprise.server.util.LookupUtil;
-public class CloudServerPluginComponent implements ServerPluginComponent { +public class CloudServerPluginComponent implements ServerPluginComponent, ControlFacet {
public void initialize(ServerPluginContext context) throws Exception { } @@ -35,6 +37,33 @@ public class CloudServerPluginComponent implements ServerPluginComponent { public void shutdown() { }
+ public ControlResults invoke(String name, Configuration parameters) { + if ("syncServerEndpoint".equals(name)) { + String serverName = parameters.getSimpleValue("name", null); + String serverAddr = parameters.getSimpleValue("address", null); + + CloudManagerLocal cloudMgr = LookupUtil.getCloudManager(); + Server server = cloudMgr.getServerByName(serverName); + + if (serverAddr != null) { + SubjectManagerLocal subjectMgr = LookupUtil.getSubjectManager(); + + server.setAddress(serverAddr); + cloudMgr.updateServer(subjectMgr.getOverlord(), server); + } + + int updateCount = notifyAgents(server); + + ControlResults results = new ControlResults(); + Configuration complexResults = results.getComplexResults(); + complexResults.put(new PropertySimple("results", updateCount + " agents have been updated.")); + + return results; + } + + return null; + } + public void syncServerEndpoints(ScheduledJobInvocationContext context) { CloudManagerLocal cloudMgr = LookupUtil.getCloudManager(); List<Server> servers = cloudMgr.getAllServers(); @@ -55,7 +84,7 @@ public class CloudServerPluginComponent implements ServerPluginComponent { }
@SuppressWarnings("unchecked") - private void notifyAgents(Server server) { + private int notifyAgents(Server server) { EntityManager entityMgr = LookupUtil.getEntityManager(); String queryString = "select r " + "from Resource r " + @@ -71,9 +100,13 @@ public class CloudServerPluginComponent implements ServerPluginComponent { .setParameter("server", server) .getResultList();
+ int numUpdated = 0; for (Resource agent : agents) { updateAgent(agent, server); + numUpdated++; } + + return numUpdated; }
private void updateAgent(Resource agent, Server server) { diff --git a/modules/enterprise/server/plugins/cloud/src/main/resources/META-INF/rhq-serverplugin.xml b/modules/enterprise/server/plugins/cloud/src/main/resources/META-INF/rhq-serverplugin.xml index de9f94a..e6944c0 100644 --- a/modules/enterprise/server/plugins/cloud/src/main/resources/META-INF/rhq-serverplugin.xml +++ b/modules/enterprise/server/plugins/cloud/src/main/resources/META-INF/rhq-serverplugin.xml @@ -7,6 +7,21 @@ xmlns:serverplugin="urn:xmlns:rhq-serverplugin" xmlns:c="urn:xmlns:rhq-configuration"> <serverplugin:plugin-component class="CloudServerPluginComponent"> + <serverplugin:control name="syncServerEndpoint" description=""> + serverplugin:parameters + <c:simple-property name="name" + required="true" + description="The server name"/> + <c:simple-property name="address" + required="false" + description="If an address is specified, it will overwrite the server's current value + in the database. If an address is not specified then the server's + current address will be sent down to its agents."/> + </serverplugin:parameters> + serverplugin:results + <c:simple-property name="results" description="Contains a status or error message"/> + </serverplugin:results> + </serverplugin:control> </serverplugin:plugin-component>
commit 36a9ba826d569a5cd43fc80553cbd665bed344e1 Author: John Sanda jsanda@redhat.com Date: Thu Sep 23 15:22:44 2010 -0400
Schedule the 'switchToServer' agent resource operation
diff --git a/modules/enterprise/server/plugins/cloud/src/main/java/org/rhq/enterprise/server/plugins/cloud/CloudServerPluginComponent.java b/modules/enterprise/server/plugins/cloud/src/main/java/org/rhq/enterprise/server/plugins/cloud/CloudServerPluginComponent.java index 154a0c2..233436d 100644 --- a/modules/enterprise/server/plugins/cloud/src/main/java/org/rhq/enterprise/server/plugins/cloud/CloudServerPluginComponent.java +++ b/modules/enterprise/server/plugins/cloud/src/main/java/org/rhq/enterprise/server/plugins/cloud/CloudServerPluginComponent.java @@ -8,10 +8,14 @@ import java.util.Map; import javax.persistence.EntityManager;
import org.rhq.core.domain.cloud.Server; +import org.rhq.core.domain.configuration.Configuration; +import org.rhq.core.domain.configuration.PropertySimple; import org.rhq.core.domain.criteria.ResourceCriteria; import org.rhq.core.domain.resource.Agent; import org.rhq.core.domain.resource.Resource; +import org.rhq.enterprise.server.auth.SubjectManagerLocal; import org.rhq.enterprise.server.cloud.CloudManagerLocal; +import org.rhq.enterprise.server.operation.OperationManagerLocal; import org.rhq.enterprise.server.plugin.pc.ScheduledJobInvocationContext; import org.rhq.enterprise.server.plugin.pc.ServerPluginComponent; import org.rhq.enterprise.server.plugin.pc.ServerPluginContext; @@ -38,7 +42,7 @@ public class CloudServerPluginComponent implements ServerPluginComponent { for (Server server : servers) { if (!context.containsKey("server:" + server.getName())) { context.put("server:" + server.getName(), server.getAddress()); - } else if (addressChanged(context, server) || true) { + } else if (addressChanged(context, server)) { context.put("server:" + server.getName(), server.getAddress()); notifyAgents(server); } @@ -61,14 +65,25 @@ public class CloudServerPluginComponent implements ServerPluginComponent { "from Agent a " + "where a.server = :server)";
- List<Resource> resources = entityMgr.createQuery(queryString) + List<Resource> agents = entityMgr.createQuery(queryString) .setParameter("pluginName", "RHQAgent") .setParameter("resourceTypeName", "RHQ Agent") .setParameter("server", server) .getResultList();
- for (Resource resource : resources) { - // update agents... + for (Resource agent : agents) { + updateAgent(agent, server); } } + + private void updateAgent(Resource agent, Server server) { + OperationManagerLocal operationMgr = LookupUtil.getOperationManager(); + SubjectManagerLocal subjectMgr = LookupUtil.getSubjectManager(); + + Configuration params = new Configuration(); + params.put(new PropertySimple("server", server.getAddress())); + + operationMgr.scheduleResourceOperation(subjectMgr.getOverlord(), agent.getId(), "switchToServer", 0, 0, 0, 0, + params, "Server endpoint has changed. Sending new address to agent."); + } }
rhq-commits@lists.fedorahosted.org