You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by im...@apache.org on 2015/09/09 20:44:23 UTC

[2/2] stratos git commit: Adding logic to clear application metadata when undeploying an application

Adding logic to clear application metadata when undeploying an application


Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/59743718
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/59743718
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/59743718

Branch: refs/heads/stratos-4.1.x
Commit: 597437184ab50b24eab7caf027db3147bf4cb617
Parents: a29d458
Author: Imesh Gunaratne <im...@apache.org>
Authored: Thu Sep 10 00:14:09 2015 +0530
Committer: Imesh Gunaratne <im...@apache.org>
Committed: Thu Sep 10 00:14:09 2015 +0530

----------------------------------------------------------------------
 .../metadata/service/api/MetadataApi.java       |   4 +-
 .../service/registry/CarbonRegistry.java        | 307 -------------------
 .../metadata/service/registry/DataStore.java    |   2 -
 .../service/registry/MetadataApiRegistry.java   | 307 +++++++++++++++++++
 .../rest/endpoint/api/StratosApiV41Utils.java   |  35 +++
 5 files changed, 344 insertions(+), 311 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/59743718/components/org.apache.stratos.metadata.service/src/main/java/org/apache/stratos/metadata/service/api/MetadataApi.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.metadata.service/src/main/java/org/apache/stratos/metadata/service/api/MetadataApi.java b/components/org.apache.stratos.metadata.service/src/main/java/org/apache/stratos/metadata/service/api/MetadataApi.java
index 48f369b..712bcaa 100644
--- a/components/org.apache.stratos.metadata.service/src/main/java/org/apache/stratos/metadata/service/api/MetadataApi.java
+++ b/components/org.apache.stratos.metadata.service/src/main/java/org/apache/stratos/metadata/service/api/MetadataApi.java
@@ -22,7 +22,7 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.metadata.service.definition.Property;
 import org.apache.stratos.metadata.service.exception.RestAPIException;
-import org.apache.stratos.metadata.service.registry.CarbonRegistry;
+import org.apache.stratos.metadata.service.registry.MetadataApiRegistry;
 import org.apache.stratos.metadata.service.registry.DataStore;
 import org.wso2.carbon.registry.api.RegistryException;
 
@@ -44,7 +44,7 @@ public class MetadataApi {
      * Meta data admin configuration loading
      */
     public MetadataApi() {
-        registry = new CarbonRegistry();
+        registry = new MetadataApiRegistry();
     }
 
     @GET

http://git-wip-us.apache.org/repos/asf/stratos/blob/59743718/components/org.apache.stratos.metadata.service/src/main/java/org/apache/stratos/metadata/service/registry/CarbonRegistry.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.metadata.service/src/main/java/org/apache/stratos/metadata/service/registry/CarbonRegistry.java b/components/org.apache.stratos.metadata.service/src/main/java/org/apache/stratos/metadata/service/registry/CarbonRegistry.java
deleted file mode 100644
index f2dd846..0000000
--- a/components/org.apache.stratos.metadata.service/src/main/java/org/apache/stratos/metadata/service/registry/CarbonRegistry.java
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- * 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.metadata.service.registry;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.stratos.metadata.service.definition.Property;
-import org.wso2.carbon.context.PrivilegedCarbonContext;
-import org.wso2.carbon.registry.core.Registry;
-import org.wso2.carbon.registry.core.Resource;
-import org.wso2.carbon.registry.core.exceptions.RegistryException;
-import org.wso2.carbon.registry.core.session.UserRegistry;
-import org.wso2.carbon.utils.multitenancy.MultitenantConstants;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.core.Context;
-import java.util.*;
-
-
-/**
- * Carbon registry implementation
- */
-
-public class CarbonRegistry implements DataStore {
-
-    private static final String mainResource = "metadata/";
-    private static Log log = LogFactory.getLog(CarbonRegistry.class);
-    @Context
-    HttpServletRequest httpServletRequest;
-
-    public CarbonRegistry() {
-    }
-
-    public List<Property> getApplicationProperties(String applicationName) throws RegistryException {
-        Registry tempRegistry = getRegistry();
-        String resourcePath = mainResource + applicationName;
-
-        if (!tempRegistry.resourceExists(resourcePath)) {
-            return null;
-        }
-        // We are using only super tenant registry to persist
-        PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
-        ctx.setTenantId(MultitenantConstants.SUPER_TENANT_ID);
-        ctx.setTenantDomain(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME);
-
-        Resource regResource = tempRegistry.get(resourcePath);
-        ArrayList<Property> newProperties = new ArrayList<Property>();
-
-        Properties props = regResource.getProperties();
-        Enumeration<?> x = props.propertyNames();
-        while (x.hasMoreElements()) {
-            String key = (String) x.nextElement();
-            List<String> values = regResource.getPropertyValues(key);
-            Property property = new Property();
-            property.setKey(key);
-            String[] valueArr = new String[values.size()];
-            property.setValues(values.toArray(valueArr));
-
-            newProperties.add(property);
-        }
-        return newProperties;
-    }
-
-    /**
-     * Get Properties of clustor
-     *
-     * @param applicationName
-     * @param clusterId
-     * @return
-     * @throws RegistryException
-     */
-    public List<Property> getClusterProperties(String applicationName, String clusterId) throws RegistryException {
-        Registry tempRegistry = getRegistry();
-        String resourcePath = mainResource + applicationName + "/" + clusterId;
-
-
-        if (!tempRegistry.resourceExists(resourcePath)) {
-            return null;
-        }
-
-        // We are using only super tenant registry to persist
-        PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
-        ctx.setTenantId(MultitenantConstants.SUPER_TENANT_ID);
-        ctx.setTenantDomain(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME);
-
-        Resource regResource = tempRegistry.get(resourcePath);
-
-        ArrayList<Property> newProperties = new ArrayList<Property>();
-
-        Properties props = regResource.getProperties();
-        Enumeration<?> x = props.propertyNames();
-        while (x.hasMoreElements()) {
-            String key = (String) x.nextElement();
-            List<String> values = regResource.getPropertyValues(key);
-            Property property = new Property();
-            property.setKey(key);
-            String[] valueArr = new String[values.size()];
-            property.setValues(values.toArray(valueArr));
-
-            newProperties.add(property);
-        }
-
-        return newProperties;
-    }
-
-    public void addPropertyToApplication(String applicationId, Property property) throws RegistryException {
-        Registry registry = getRegistry();
-        String resourcePath = mainResource + applicationId;
-
-        try {
-            // We are using only super tenant registry to persist
-            PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
-            ctx.setTenantId(MultitenantConstants.SUPER_TENANT_ID);
-            ctx.setTenantDomain(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME);
-
-            //registry.beginTransaction();
-            Resource nodeResource = null;
-            if (registry.resourceExists(resourcePath)) {
-                nodeResource = registry.get(resourcePath);
-            } else {
-                nodeResource = registry.newCollection();
-                if (log.isDebugEnabled()) {
-                    log.debug("Registry resource is create at path for application: " + nodeResource.getPath());
-                }
-            }
-
-            boolean updated = false;
-            for (String value : property.getValues()) {
-                if (!propertyValueExist(nodeResource, property.getKey(), value)) {
-                    updated = true;
-                    log.info(String.format("Registry property is added: [resource-path] %s " +
-                                    "[Property Name] %s [Property Value] %s",
-                            resourcePath, property.getKey(), value));
-                    nodeResource.addProperty(property.getKey(), value);
-                } else {
-                    log.info(String.format("Property value already exist property=%s value=%s", property.getKey(), value));
-                }
-            }
-
-            if (updated) {
-                registry.put(resourcePath, nodeResource);
-            }
-            //registry.commitTransaction();
-        } catch (Exception e) {
-            String msg = "Failed to persist properties in registry: " + resourcePath;
-            //registry.rollbackTransaction();
-            log.error(msg, e);
-            throw new RegistryException(msg, e);
-        }
-    }
-
-    private boolean propertyValueExist(Resource nodeResource, String key, String value) {
-        List<String> properties = nodeResource.getPropertyValues(key);
-        if (properties == null) {
-            return false;
-        } else {
-            return properties.contains(value);
-        }
-
-    }
-
-    public boolean removePropertyValueFromApplication(String applicationId, String propertyName, String valueToRemove)
-            throws RegistryException {
-        Registry registry = getRegistry();
-        String resourcePath = mainResource + applicationId;
-
-        // We are using only super tenant registry to persist
-        PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
-        ctx.setTenantId(MultitenantConstants.SUPER_TENANT_ID);
-        ctx.setTenantDomain(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME);
-
-        registry.beginTransaction();
-        Resource nodeResource;
-        if (registry.resourceExists(resourcePath)) {
-            nodeResource = registry.get(resourcePath);
-        } else {
-            log.warn(String.format("Registry [resource] %s not found ", resourcePath));
-            return false;
-        }
-        nodeResource.removePropertyValue(propertyName, valueToRemove);
-        registry.put(resourcePath, nodeResource);
-        registry.commitTransaction();
-
-        log.info(String.format("Application %s property %s value %s is removed from metadata ",
-                applicationId, propertyName, valueToRemove));
-
-        return true;
-    }
-
-    /**
-     * Add property to cluster
-     *
-     * @param applicationId
-     * @param clusterId
-     * @param property
-     * @throws RegistryException
-     */
-    public void addPropertyToCluster(String applicationId, String clusterId, Property property) throws RegistryException {
-        Registry registry = getRegistry();
-        String resourcePath = mainResource + applicationId + "/" + clusterId;
-
-        // We are using only super tenant registry to persist
-        PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
-        ctx.setTenantId(MultitenantConstants.SUPER_TENANT_ID);
-        ctx.setTenantDomain(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME);
-
-        Resource nodeResource = null;
-        if (registry.resourceExists(resourcePath)) {
-            nodeResource = registry.get(resourcePath);
-        } else {
-            nodeResource = registry.newResource();
-            if (log.isDebugEnabled()) {
-                log.debug("Registry resource is create at path for cluster" + nodeResource.getPath() + " for cluster");
-            }
-        }
-
-        nodeResource.setProperty(property.getKey(), Arrays.asList(property.getValues()));
-        registry.put(resourcePath, nodeResource);
-
-        log.info(String.format("Registry property is persisted: [resource-path] %s [Property Name] %s [Property Values] %s",
-                resourcePath, property.getKey(), Arrays.asList(property.getValues())));
-    }
-
-    private UserRegistry getRegistry() throws RegistryException {
-        return org.apache.stratos.common.internal.ServiceReferenceHolder.getInstance().
-                getRegistryService().getGovernanceSystemRegistry();
-    }
-
-    /**
-     * Delete the resource identified by the applicationId, if exist.
-     *
-     * @param applicationId ID of the application.
-     * @return True if resource exist and able to delete, else false.
-     * @throws RegistryException
-     */
-    public boolean deleteApplicationProperties(String applicationId) throws RegistryException {
-        if (StringUtils.isBlank(applicationId)) {
-            throw new IllegalArgumentException("Application ID can not be null");
-        }
-
-        // We are using only super tenant registry to persist
-        PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
-        ctx.setTenantId(MultitenantConstants.SUPER_TENANT_ID);
-        ctx.setTenantDomain(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME);
-
-        Registry registry;
-        String resourcePath = mainResource + applicationId;
-        registry = getRegistry();
-        registry.beginTransaction();
-        if (registry.resourceExists(resourcePath)) {
-            registry.delete(resourcePath);
-            registry.commitTransaction();
-            log.info(String.format("Application [application-id ] properties removed from registry %s", applicationId));
-            return true;
-        }
-
-        return false;
-    }
-
-    public boolean removePropertyFromApplication(String applicationId, String propertyName)
-            throws org.wso2.carbon.registry.api.RegistryException {
-        Registry registry = getRegistry();
-        String resourcePath = mainResource + applicationId;
-        // We are using only super tenant registry to persist
-        PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
-        ctx.setTenantId(MultitenantConstants.SUPER_TENANT_ID);
-        ctx.setTenantDomain(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME);
-
-        Resource nodeResource;
-        if (registry.resourceExists(resourcePath)) {
-            nodeResource = registry.get(resourcePath);
-            if (nodeResource.getProperty(propertyName) == null) {
-                log.info(String.format("[application-id] %s does not have a property [property-name] %s ", applicationId,
-                        propertyName));
-                return false;
-            } else {
-                nodeResource.removeProperty(propertyName);
-                registry.put(resourcePath, nodeResource);
-            }
-        } else {
-            log.error("Registry resource not not found at " + resourcePath);
-            return false;
-        }
-
-        log.info(String.format("Application [application-id] %s property [property-name] %s removed from Registry ",
-                applicationId, propertyName));
-        return true;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/stratos/blob/59743718/components/org.apache.stratos.metadata.service/src/main/java/org/apache/stratos/metadata/service/registry/DataStore.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.metadata.service/src/main/java/org/apache/stratos/metadata/service/registry/DataStore.java b/components/org.apache.stratos.metadata.service/src/main/java/org/apache/stratos/metadata/service/registry/DataStore.java
index c11a2b9..a6415bd 100644
--- a/components/org.apache.stratos.metadata.service/src/main/java/org/apache/stratos/metadata/service/registry/DataStore.java
+++ b/components/org.apache.stratos.metadata.service/src/main/java/org/apache/stratos/metadata/service/registry/DataStore.java
@@ -43,6 +43,4 @@ public interface DataStore {
     public boolean removePropertyFromApplication(String applicationId, String propertyName) throws RegistryException;
 
     public boolean removePropertyValueFromApplication(String applicationId, String propertyName, String valueToRemove) throws RegistryException;
-
-
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/59743718/components/org.apache.stratos.metadata.service/src/main/java/org/apache/stratos/metadata/service/registry/MetadataApiRegistry.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.metadata.service/src/main/java/org/apache/stratos/metadata/service/registry/MetadataApiRegistry.java b/components/org.apache.stratos.metadata.service/src/main/java/org/apache/stratos/metadata/service/registry/MetadataApiRegistry.java
new file mode 100644
index 0000000..8cd9cb6
--- /dev/null
+++ b/components/org.apache.stratos.metadata.service/src/main/java/org/apache/stratos/metadata/service/registry/MetadataApiRegistry.java
@@ -0,0 +1,307 @@
+/*
+ * 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.metadata.service.registry;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.metadata.service.definition.Property;
+import org.wso2.carbon.context.PrivilegedCarbonContext;
+import org.wso2.carbon.registry.core.Registry;
+import org.wso2.carbon.registry.core.Resource;
+import org.wso2.carbon.registry.core.exceptions.RegistryException;
+import org.wso2.carbon.registry.core.session.UserRegistry;
+import org.wso2.carbon.utils.multitenancy.MultitenantConstants;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.core.Context;
+import java.util.*;
+
+
+/**
+ * Carbon registry implementation
+ */
+
+public class MetadataApiRegistry implements DataStore {
+
+    private static final String mainResource = "metadata/";
+    private static Log log = LogFactory.getLog(MetadataApiRegistry.class);
+    @Context
+    HttpServletRequest httpServletRequest;
+
+    public MetadataApiRegistry() {
+    }
+
+    public List<Property> getApplicationProperties(String applicationName) throws RegistryException {
+        Registry tempRegistry = getRegistry();
+        String resourcePath = mainResource + applicationName;
+
+        if (!tempRegistry.resourceExists(resourcePath)) {
+            return null;
+        }
+        // We are using only super tenant registry to persist
+        PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
+        ctx.setTenantId(MultitenantConstants.SUPER_TENANT_ID);
+        ctx.setTenantDomain(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME);
+
+        Resource regResource = tempRegistry.get(resourcePath);
+        ArrayList<Property> newProperties = new ArrayList<Property>();
+
+        Properties props = regResource.getProperties();
+        Enumeration<?> x = props.propertyNames();
+        while (x.hasMoreElements()) {
+            String key = (String) x.nextElement();
+            List<String> values = regResource.getPropertyValues(key);
+            Property property = new Property();
+            property.setKey(key);
+            String[] valueArr = new String[values.size()];
+            property.setValues(values.toArray(valueArr));
+
+            newProperties.add(property);
+        }
+        return newProperties;
+    }
+
+    /**
+     * Get Properties of clustor
+     *
+     * @param applicationName
+     * @param clusterId
+     * @return
+     * @throws RegistryException
+     */
+    public List<Property> getClusterProperties(String applicationName, String clusterId) throws RegistryException {
+        Registry tempRegistry = getRegistry();
+        String resourcePath = mainResource + applicationName + "/" + clusterId;
+
+
+        if (!tempRegistry.resourceExists(resourcePath)) {
+            return null;
+        }
+
+        // We are using only super tenant registry to persist
+        PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
+        ctx.setTenantId(MultitenantConstants.SUPER_TENANT_ID);
+        ctx.setTenantDomain(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME);
+
+        Resource regResource = tempRegistry.get(resourcePath);
+
+        ArrayList<Property> newProperties = new ArrayList<Property>();
+
+        Properties props = regResource.getProperties();
+        Enumeration<?> x = props.propertyNames();
+        while (x.hasMoreElements()) {
+            String key = (String) x.nextElement();
+            List<String> values = regResource.getPropertyValues(key);
+            Property property = new Property();
+            property.setKey(key);
+            String[] valueArr = new String[values.size()];
+            property.setValues(values.toArray(valueArr));
+
+            newProperties.add(property);
+        }
+
+        return newProperties;
+    }
+
+    public void addPropertyToApplication(String applicationId, Property property) throws RegistryException {
+        Registry registry = getRegistry();
+        String resourcePath = mainResource + applicationId;
+
+        try {
+            // We are using only super tenant registry to persist
+            PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
+            ctx.setTenantId(MultitenantConstants.SUPER_TENANT_ID);
+            ctx.setTenantDomain(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME);
+
+            //registry.beginTransaction();
+            Resource nodeResource = null;
+            if (registry.resourceExists(resourcePath)) {
+                nodeResource = registry.get(resourcePath);
+            } else {
+                nodeResource = registry.newCollection();
+                if (log.isDebugEnabled()) {
+                    log.debug("Registry resource is create at path for application: " + nodeResource.getPath());
+                }
+            }
+
+            boolean updated = false;
+            for (String value : property.getValues()) {
+                if (!propertyValueExist(nodeResource, property.getKey(), value)) {
+                    updated = true;
+                    log.info(String.format("Registry property is added: [resource-path] %s " +
+                                    "[Property Name] %s [Property Value] %s",
+                            resourcePath, property.getKey(), value));
+                    nodeResource.addProperty(property.getKey(), value);
+                } else {
+                    log.info(String.format("Property value already exist property=%s value=%s", property.getKey(), value));
+                }
+            }
+
+            if (updated) {
+                registry.put(resourcePath, nodeResource);
+            }
+            //registry.commitTransaction();
+        } catch (Exception e) {
+            String msg = "Failed to persist properties in registry: " + resourcePath;
+            //registry.rollbackTransaction();
+            log.error(msg, e);
+            throw new RegistryException(msg, e);
+        }
+    }
+
+    private boolean propertyValueExist(Resource nodeResource, String key, String value) {
+        List<String> properties = nodeResource.getPropertyValues(key);
+        if (properties == null) {
+            return false;
+        } else {
+            return properties.contains(value);
+        }
+
+    }
+
+    public boolean removePropertyValueFromApplication(String applicationId, String propertyName, String valueToRemove)
+            throws RegistryException {
+        Registry registry = getRegistry();
+        String resourcePath = mainResource + applicationId;
+
+        // We are using only super tenant registry to persist
+        PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
+        ctx.setTenantId(MultitenantConstants.SUPER_TENANT_ID);
+        ctx.setTenantDomain(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME);
+
+        registry.beginTransaction();
+        Resource nodeResource;
+        if (registry.resourceExists(resourcePath)) {
+            nodeResource = registry.get(resourcePath);
+        } else {
+            log.warn(String.format("Registry [resource] %s not found ", resourcePath));
+            return false;
+        }
+        nodeResource.removePropertyValue(propertyName, valueToRemove);
+        registry.put(resourcePath, nodeResource);
+        registry.commitTransaction();
+
+        log.info(String.format("Application %s property %s value %s is removed from metadata ",
+                applicationId, propertyName, valueToRemove));
+
+        return true;
+    }
+
+    /**
+     * Add property to cluster
+     *
+     * @param applicationId
+     * @param clusterId
+     * @param property
+     * @throws RegistryException
+     */
+    public void addPropertyToCluster(String applicationId, String clusterId, Property property) throws RegistryException {
+        Registry registry = getRegistry();
+        String resourcePath = mainResource + applicationId + "/" + clusterId;
+
+        // We are using only super tenant registry to persist
+        PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
+        ctx.setTenantId(MultitenantConstants.SUPER_TENANT_ID);
+        ctx.setTenantDomain(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME);
+
+        Resource nodeResource = null;
+        if (registry.resourceExists(resourcePath)) {
+            nodeResource = registry.get(resourcePath);
+        } else {
+            nodeResource = registry.newResource();
+            if (log.isDebugEnabled()) {
+                log.debug("Registry resource is create at path for cluster" + nodeResource.getPath() + " for cluster");
+            }
+        }
+
+        nodeResource.setProperty(property.getKey(), Arrays.asList(property.getValues()));
+        registry.put(resourcePath, nodeResource);
+
+        log.info(String.format("Registry property is persisted: [resource-path] %s [Property Name] %s [Property Values] %s",
+                resourcePath, property.getKey(), Arrays.asList(property.getValues())));
+    }
+
+    private UserRegistry getRegistry() throws RegistryException {
+        return org.apache.stratos.common.internal.ServiceReferenceHolder.getInstance().
+                getRegistryService().getGovernanceSystemRegistry();
+    }
+
+    /**
+     * Delete the resource identified by the applicationId, if exist.
+     *
+     * @param applicationId ID of the application.
+     * @return True if resource exist and able to delete, else false.
+     * @throws RegistryException
+     */
+    public boolean deleteApplicationProperties(String applicationId) throws RegistryException {
+        if (StringUtils.isBlank(applicationId)) {
+            throw new IllegalArgumentException("Application ID can not be null");
+        }
+
+        // We are using only super tenant registry to persist
+        PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
+        ctx.setTenantId(MultitenantConstants.SUPER_TENANT_ID);
+        ctx.setTenantDomain(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME);
+
+        Registry registry;
+        String resourcePath = mainResource + applicationId;
+        registry = getRegistry();
+        registry.beginTransaction();
+        if (registry.resourceExists(resourcePath)) {
+            registry.delete(resourcePath);
+            registry.commitTransaction();
+            log.info(String.format("Application [application-id ] properties removed from registry %s", applicationId));
+            return true;
+        }
+
+        return false;
+    }
+
+    public boolean removePropertyFromApplication(String applicationId, String propertyName)
+            throws org.wso2.carbon.registry.api.RegistryException {
+        Registry registry = getRegistry();
+        String resourcePath = mainResource + applicationId;
+        // We are using only super tenant registry to persist
+        PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
+        ctx.setTenantId(MultitenantConstants.SUPER_TENANT_ID);
+        ctx.setTenantDomain(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME);
+
+        Resource nodeResource;
+        if (registry.resourceExists(resourcePath)) {
+            nodeResource = registry.get(resourcePath);
+            if (nodeResource.getProperty(propertyName) == null) {
+                log.info(String.format("[application-id] %s does not have a property [property-name] %s ", applicationId,
+                        propertyName));
+                return false;
+            } else {
+                nodeResource.removeProperty(propertyName);
+                registry.put(resourcePath, nodeResource);
+            }
+        } else {
+            log.error("Registry resource not not found at " + resourcePath);
+            return false;
+        }
+
+        log.info(String.format("Application [application-id] %s property [property-name] %s removed from Registry ",
+                applicationId, propertyName));
+        return true;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/59743718/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41Utils.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41Utils.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41Utils.java
index b584cfe..baff88d 100644
--- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41Utils.java
+++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/api/StratosApiV41Utils.java
@@ -81,6 +81,7 @@ import org.apache.stratos.rest.endpoint.util.converter.ObjectConverter;
 import org.wso2.carbon.context.CarbonContext;
 import org.wso2.carbon.context.PrivilegedCarbonContext;
 import org.wso2.carbon.context.RegistryType;
+import org.wso2.carbon.registry.core.Registry;
 import org.wso2.carbon.registry.core.exceptions.RegistryException;
 import org.wso2.carbon.registry.core.session.UserRegistry;
 import org.wso2.carbon.stratos.common.exception.StratosException;
@@ -107,6 +108,9 @@ public class StratosApiV41Utils {
     public static final String APPLICATION_STATUS_UNDEPLOYING = "Undeploying";
     public static final String KUBERNETES_IAAS_PROVIDER = "kubernetes";
 
+    private static final String METADATA_REG_PATH = "metadata/";
+
+
     /**
      * Add New Cartridge
      *
@@ -1896,6 +1900,14 @@ public class StratosApiV41Utils {
         if (autoscalerServiceClient != null) {
             try {
                 autoscalerServiceClient.undeployApplication(applicationId, force);
+
+                try {
+                    clearMetadata(applicationId);
+                } catch (RegistryException e) {
+                    String message = "Could not remove application metadata: [application-id] " + applicationId;
+                    log.error(message, e);
+                    throw new RestAPIException(message, e);
+                }
             } catch (RemoteException e) {
                 String message = "Could not undeploy application: [application-id] " + applicationId;
                 log.error(message, e);
@@ -1908,6 +1920,29 @@ public class StratosApiV41Utils {
         }
     }
 
+    private static void clearMetadata(String applicationId) throws RegistryException {
+
+        PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
+        ctx.setTenantId(MultitenantConstants.SUPER_TENANT_ID);
+        ctx.setTenantDomain(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME);
+
+        String resourcePath = METADATA_REG_PATH + applicationId;
+        Registry registry = (UserRegistry) PrivilegedCarbonContext.getThreadLocalCarbonContext()
+                .getRegistry(RegistryType.SYSTEM_GOVERNANCE);
+        try {
+            registry.beginTransaction();
+            if (registry.resourceExists(resourcePath)) {
+                registry.delete(resourcePath);
+                registry.commitTransaction();
+                log.info(String.format("Application metadata removed: [application-id] %s", applicationId));
+            }
+        } catch (RegistryException e) {
+            registry.rollbackTransaction();
+            throw e;
+        }
+    }
+
+
     /**
      * Get Application Runtime
      *