Added required event, listener, message processor and added to processor chain
Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/2ba19d85 Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/2ba19d85 Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/2ba19d85 Branch: refs/heads/4.1.0-test Commit: 2ba19d85cdaaff007970329f8671707f3ed52356 Parents: fb8f23e Author: Shiro <[email protected]> Authored: Wed Dec 10 20:12:17 2014 +0530 Committer: Shiro <[email protected]> Committed: Thu Dec 11 18:03:06 2014 +0530 ---------------------------------------------------------------------- .../applications/topic/ApplicationBuilder.java | 4 +- .../topic/ApplicationsEventPublisher.java | 5 + .../application/ApplicationTopicReceiver.java | 14 +-- .../applications/ApplicationDeletedEvent.java | 53 +++++++++++ .../ApplicationDeletedEventListener.java | 27 ++++++ .../ApplicationDeletedMessageProcessor.java | 98 ++++++++++++++++++++ .../ApplicationsMessageProcessorChain.java | 6 ++ 7 files changed, 200 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/2ba19d85/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java index d46a232..81581b8 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java @@ -181,10 +181,11 @@ public class ApplicationBuilder { log.debug("Handling application unDeployment for [application-id] " + appId); } Set<ClusterDataHolder> clusterData; + Application application; ApplicationHolder.acquireWriteLock(); try { Applications applications = ApplicationHolder.getApplications(); - Application application = applications.getApplication(appId); + application = applications.getApplication(appId); //update the status of the Group if (application == null) { log.warn(String.format("Application does not exist: [application-id] %s", @@ -206,6 +207,7 @@ public class ApplicationBuilder { } log.info("[Application] " + appId + " has been successfully undeployed"); + ApplicationsEventPublisher.sendApplicationDeletedEvent(application); } public static boolean handleApplicationPolicyUndeployed(String appId) { http://git-wip-us.apache.org/repos/asf/stratos/blob/2ba19d85/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java index 52e8c55..61417a6 100644 --- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java +++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationsEventPublisher.java @@ -30,6 +30,11 @@ public class ApplicationsEventPublisher { publishEvent(new ApplicationCreatedEvent(application)); } + + public static void sendApplicationDeletedEvent (Application application) { + + publishEvent(new ApplicationDeletedEvent(application)); + } public static void sendApplicationInstanceCreatedEvent(String appId, ApplicationInstance applicationInstance) { http://git-wip-us.apache.org/repos/asf/stratos/blob/2ba19d85/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/receiver/application/ApplicationTopicReceiver.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/receiver/application/ApplicationTopicReceiver.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/receiver/application/ApplicationTopicReceiver.java index 3530b80..08a9ea4 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/receiver/application/ApplicationTopicReceiver.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/receiver/application/ApplicationTopicReceiver.java @@ -22,7 +22,9 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.stratos.cloud.controller.messaging.topology.TopologyBuilder; import org.apache.stratos.messaging.event.Event; +import org.apache.stratos.messaging.event.applications.ApplicationDeletedEvent; import org.apache.stratos.messaging.event.applications.ApplicationInstanceTerminatedEvent; +import org.apache.stratos.messaging.listener.applications.ApplicationDeletedEventListener; import org.apache.stratos.messaging.listener.applications.ApplicationInstanceTerminatedEventListener; import org.apache.stratos.messaging.listener.applications.ApplicationUndeployedEventListener; import org.apache.stratos.messaging.message.receiver.applications.ApplicationsEventReceiver; @@ -68,16 +70,16 @@ public class ApplicationTopicReceiver { } private void addEventListeners() { - /*applicationsEventReceiver.addEventListener(new ApplicationUndeployedEventListener() { + applicationsEventReceiver.addEventListener(new ApplicationDeletedEventListener() { @Override protected void onEvent(Event event) { //Remove the application related data - ApplicationInstanceTerminatedEvent terminatedEvent = (ApplicationInstanceTerminatedEvent)event; - log.info("ApplicationTerminatedEvent received for [application] " + terminatedEvent.getAppId()); - String appId = terminatedEvent.getAppId(); - TopologyBuilder.handleApplicationClustersRemoved(appId, terminatedEvent.getClusterData()); + ApplicationDeletedEvent deletedEvent = (ApplicationDeletedEvent)event; + log.info("ApplicationDeletedEvent received for [application] " + deletedEvent.getAppId()); + String appId = deletedEvent.getAppId(); + TopologyBuilder.handleApplicationClustersRemoved(appId, deletedEvent.getClusterData()); } - });*/ + }); } public void setExecutorService(ExecutorService executorService) { http://git-wip-us.apache.org/repos/asf/stratos/blob/2ba19d85/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/applications/ApplicationDeletedEvent.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/applications/ApplicationDeletedEvent.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/applications/ApplicationDeletedEvent.java new file mode 100644 index 0000000..32970f2 --- /dev/null +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/applications/ApplicationDeletedEvent.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.stratos.messaging.event.applications; + +import org.apache.stratos.messaging.domain.applications.Application; +import org.apache.stratos.messaging.domain.applications.ClusterDataHolder; +import org.apache.stratos.messaging.event.Event; + +import java.io.Serializable; +import java.util.Set; + +/** + * This event will be fired upon the application deletion is detected. + */ +public class ApplicationDeletedEvent extends Event implements Serializable { + private static final long serialVersionUID = 2625412714611885089L; //FIXME - correct UID + + private Application application; + //private String appId; + private Set<ClusterDataHolder> clusterData; + + public ApplicationDeletedEvent(Application application) { + this.application = application; + } + + public String getAppId() { + return application.getKey(); + } + + public Set<ClusterDataHolder> getClusterData() { + return application.getClusterDataRecursively(); + } + + public Application getApplication() { + return application; + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/2ba19d85/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/applications/ApplicationDeletedEventListener.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/applications/ApplicationDeletedEventListener.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/applications/ApplicationDeletedEventListener.java new file mode 100644 index 0000000..3d9cccc --- /dev/null +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/listener/applications/ApplicationDeletedEventListener.java @@ -0,0 +1,27 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.stratos.messaging.listener.applications; + +import org.apache.stratos.messaging.listener.EventListener; + +/** + * This listener will get triggered upon the application deleted event. + */ +public abstract class ApplicationDeletedEventListener extends EventListener { +} http://git-wip-us.apache.org/repos/asf/stratos/blob/2ba19d85/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/applications/ApplicationDeletedMessageProcessor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/applications/ApplicationDeletedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/applications/ApplicationDeletedMessageProcessor.java new file mode 100644 index 0000000..c2fc99f --- /dev/null +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/applications/ApplicationDeletedMessageProcessor.java @@ -0,0 +1,98 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.stratos.messaging.message.processor.applications; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.stratos.messaging.domain.applications.Applications; +import org.apache.stratos.messaging.event.applications.ApplicationCreatedEvent; +import org.apache.stratos.messaging.event.applications.ApplicationDeletedEvent; +import org.apache.stratos.messaging.message.processor.MessageProcessor; +import org.apache.stratos.messaging.message.processor.applications.updater.ApplicationsUpdater; +import org.apache.stratos.messaging.util.Util; + +public class ApplicationDeletedMessageProcessor extends MessageProcessor { + + private static final Log log = LogFactory.getLog(ApplicationCreatedMessageProcessor.class); + private MessageProcessor nextProcessor; + + @Override + public void setNext(MessageProcessor nextProcessor) { + this.nextProcessor = nextProcessor; + } + + @Override + public boolean process(String type, String message, Object object) { + + Applications applications = (Applications) object; + + if (ApplicationDeletedEvent.class.getName().equals(type)) { + if (!applications.isInitialized()) { + return false; + } + + ApplicationDeletedEvent event = (ApplicationDeletedEvent) Util.jsonToObject(message, ApplicationDeletedEvent.class); + if (event == null) { + log.error("Unable to convert the JSON message to ApplicationDeletedEvent"); + return false; + } + + ApplicationsUpdater.acquireWriteLockForApplications(); + try { + return doProcess(event, applications); + + } finally { + ApplicationsUpdater.releaseWriteLockForApplications(); + } + + } else { + if (nextProcessor != null) { + // ask the next processor to take care of the message. + return nextProcessor.process(type, message, applications); + } else { + throw new RuntimeException(String.format("Failed to process message using available message processors: [type] %s [body] %s", type, message)); + } + } + } + + private boolean doProcess(ApplicationDeletedEvent event, Applications applications) { + + // check if required properties are available + if (event.getApplication() == null) { + String errorMsg = "Application object of application deleted event is invalid"; + log.error(errorMsg); + throw new RuntimeException(errorMsg); + } + + if (event.getApplication().getUniqueIdentifier() == null || event.getApplication().getUniqueIdentifier().isEmpty()) { + String errorMsg = "App id of application deleted event is invalid: [ " + event.getApplication().getUniqueIdentifier() + " ]"; + log.error(errorMsg); + throw new RuntimeException(errorMsg); + } + + //TODO Check before removing whether there are any deloyments alive + + // Remove application and clusters from topology + applications.removeApplication(event.getAppId()); + + notifyEventListeners(event); + return true; + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/2ba19d85/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/applications/ApplicationsMessageProcessorChain.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/applications/ApplicationsMessageProcessorChain.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/applications/ApplicationsMessageProcessorChain.java index 98b34ad..916a96a 100644 --- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/applications/ApplicationsMessageProcessorChain.java +++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/applications/ApplicationsMessageProcessorChain.java @@ -39,6 +39,7 @@ public class ApplicationsMessageProcessorChain extends MessageProcessorChain { private ApplicationInstanceCreatedMessageProcessor applicationInstanceCreatedMessageProcessor; private ApplicationInstanceActivatedMessageProcessor applicationActivatedMessageProcessor; private ApplicationCreatedMessageProcessor applicationCreatedMessageProcessor; + private ApplicationDeletedMessageProcessor applicationDeletedMessageProcessor; private ApplicationInstanceInactivatedMessageProcessor applicationInactivatedMessageProcessor; private ApplicationInstanceTerminatedMessageProcessor applicationTerminatedMessageProcessor; private ApplicationInstanceTerminatingMessageProcessor applicationTerminatingMessageProcessor; @@ -70,6 +71,9 @@ public class ApplicationsMessageProcessorChain extends MessageProcessorChain { applicationCreatedMessageProcessor = new ApplicationCreatedMessageProcessor(); add(applicationCreatedMessageProcessor); + + applicationDeletedMessageProcessor = new ApplicationDeletedMessageProcessor(); + add(applicationDeletedMessageProcessor); applicationInactivatedMessageProcessor = new ApplicationInstanceInactivatedMessageProcessor(); add(applicationInactivatedMessageProcessor); @@ -104,6 +108,8 @@ public class ApplicationsMessageProcessorChain extends MessageProcessorChain { applicationInstanceCreatedMessageProcessor.addEventListener(eventListener); } else if (eventListener instanceof ApplicationCreatedEventListener) { applicationCreatedMessageProcessor.addEventListener(eventListener); + } else if (eventListener instanceof ApplicationDeletedEventListener) { + applicationDeletedMessageProcessor.addEventListener(eventListener); } else if (eventListener instanceof ApplicationInstanceActivatedEventListener) { applicationActivatedMessageProcessor.addEventListener(eventListener); } else if (eventListener instanceof ApplicationInstanceInactivatedEventListener) {
