k8s.io/client-go => k8s.io/client-go v11.0.1-0.20190409021438-1a26190bd76a+incompatible
        k8s.io/cloud-provider => k8s.io/cloud-provider v0.0.0-20190409023720-1bc0c81fa51d
 )
+
+go 1.13
 
        }, nil
 }
 
+func (k *KubernetesClient) updateKind(resTempl helm.KubernetesResourceTemplate,
+        namespace string) (helm.KubernetesResource, error) {
+
+        if _, err := os.Stat(resTempl.FilePath); os.IsNotExist(err) {
+                return helm.KubernetesResource{}, pkgerrors.New("File " + resTempl.FilePath + "does not exists")
+        }
+
+        log.Info("Processing Kubernetes Resource", log.Fields{
+                "filepath": resTempl.FilePath,
+        })
+
+        pluginImpl, err := plugin.GetPluginByKind(resTempl.GVK.Kind)
+        if err != nil {
+                return helm.KubernetesResource{}, pkgerrors.Wrap(err, "Error loading plugin")
+        }
+
+        updatedResourceName, err := pluginImpl.Update(resTempl.FilePath, namespace, k)
+        if err != nil {
+                log.Error("Error Updating Resource", log.Fields{
+                        "error":    err,
+                        "gvk":      resTempl.GVK,
+                        "filepath": resTempl.FilePath,
+                })
+                return helm.KubernetesResource{}, pkgerrors.Wrap(err, "Error in plugin "+resTempl.GVK.Kind+" plugin")
+        }
+
+        log.Info("Updated Kubernetes Resource", log.Fields{
+                "resource": updatedResourceName,
+                "gvk":      resTempl.GVK,
+        })
+
+        return helm.KubernetesResource{
+                GVK:  resTempl.GVK,
+                Name: updatedResourceName,
+        }, nil
+}
+
 func (k *KubernetesClient) createResources(sortedTemplates []helm.KubernetesResourceTemplate,
        namespace string) ([]helm.KubernetesResource, error) {
 
        return createdResources, nil
 }
 
+func (k *KubernetesClient) updateResources(sortedTemplates []helm.KubernetesResourceTemplate,
+        namespace string) ([]helm.KubernetesResource, error) {
+
+        err := k.ensureNamespace(namespace)
+        if err != nil {
+                return nil, pkgerrors.Wrap(err, "Creating Namespace")
+        }
+
+        var updatedResources []helm.KubernetesResource
+        for _, resTempl := range sortedTemplates {
+                resUpdated, err := k.updateKind(resTempl, namespace)
+                if err != nil {
+                        return nil, pkgerrors.Wrapf(err, "Error updating kind: %+v", resTempl.GVK)
+                }
+                updatedResources = append(updatedResources, resUpdated)
+        }
+
+        return updatedResources, nil
+}
+
 func (k *KubernetesClient) deleteKind(resource helm.KubernetesResource, namespace string) error {
        log.Warn("Deleting Resource", log.Fields{
                "gvk":      resource.GVK,
 
                                        //Move onto the next cloud region
                                        continue
                                }
+                               //assuming - the resource is not exist already
                                data.createdResources, err = k8sClient.createResources(data.resourceTemplates, inst.Namespace)
+                                errCreate := err
                                if err != nil {
-                                       log.Printf("Error Creating resources: %s", err.Error())
-                                       continue
+                                       // assuming - the err represent the resource is already exist, so going for update
+                                       data.createdResources, err = k8sClient.updateResources(data.resourceTemplates, inst.Namespace)
+                                       if err != nil {
+                                                log.Printf("Error Creating resources: %s", errCreate.Error())
+                                               log.Printf("Error Updating resources: %s", err.Error())
+                                               continue
+                                       }
                                }
                        }
                        //TODO: Needs to add code to call Kubectl create
 
 
        //Delete a kubernetes resource described in the provided namespace
        Delete(resource helm.KubernetesResource, namespace string, client KubernetesConnector) error
+
+        //Update kubernetes resource based on the groupVersionKind and resourceName provided in resource
+        Update(yamlFilePath string, namespace string, client KubernetesConnector) (string, error)
 }
 
 // GetPluginByKind returns a plugin by the kind name
 
 func (p mockPlugin) Get(resource helm.KubernetesResource, namespace string, client plugin.KubernetesConnector) (string, error) {
        return resource.Name, nil
 }
+
+// Update existing resources
+func (p mockPlugin) Update(yamlFilePath string, namespace string, client plugin.KubernetesConnector) (string, error) {
+
+        return "", nil
+}
+
 
        return createdObj.GetName(), nil
 }
 
+// Update deployment object in a specific Kubernetes cluster
+func (g genericPlugin) Update(yamlFilePath string, namespace string, client plugin.KubernetesConnector) (string, error) {
+        if namespace == "" {
+                namespace = "default"
+        }
+
+        //Decode the yaml file to create a runtime.Object
+        unstruct := &unstructured.Unstructured{}
+        //Ignore the returned obj as we expect the data in unstruct
+        _, err := utils.DecodeYAML(yamlFilePath, unstruct)
+        if err != nil {
+                return "", pkgerrors.Wrap(err, "Decode deployment object error")
+        }
+
+        dynClient := client.GetDynamicClient()
+        mapper := client.GetMapper()
+
+        gvk := unstruct.GroupVersionKind()
+        mapping, err := mapper.RESTMapping(schema.GroupKind{Group: gvk.Group, Kind: gvk.Kind}, gvk.Version)
+        if err != nil {
+                return "", pkgerrors.Wrap(err, "Mapping kind to resource error")
+        }
+
+        //Add the tracking label to all resources created here
+        labels := unstruct.GetLabels()
+        //Check if labels exist for this object
+        if labels == nil {
+                labels = map[string]string{}
+        }
+        labels[config.GetConfiguration().KubernetesLabelName] = client.GetInstanceID()
+        unstruct.SetLabels(labels)
+
+        // This checks if the resource we are creating has a podSpec in it
+        // Eg: Deployment, StatefulSet, Job etc..
+        // If a PodSpec is found, the label will be added to it too.
+        plugin.TagPodsIfPresent(unstruct, client.GetInstanceID())
+
+        gvr := mapping.Resource
+        var updatedObj *unstructured.Unstructured
+
+        switch mapping.Scope.Name() {
+        case meta.RESTScopeNameNamespace:
+                updatedObj, err = dynClient.Resource(gvr).Namespace(namespace).Update(unstruct, metav1.UpdateOptions{})
+        case meta.RESTScopeNameRoot:
+                updatedObj, err = dynClient.Resource(gvr).Update(unstruct, metav1.UpdateOptions{})
+        default:
+                return "", pkgerrors.New("Got an unknown RESTSCopeName for mapping: " + gvk.String())
+        }
+
+        if err != nil {
+                return "", pkgerrors.Wrap(err, "Update object error")
+        }
+
+        return updatedObj.GetName(), nil
+}
+
 // Get an existing resource hosted in a specific Kubernetes cluster
 func (g genericPlugin) Get(resource helm.KubernetesResource,
        namespace string, client plugin.KubernetesConnector) (string, error) {
 
 
        return result, nil
 }
+
+func (p namespacePlugin) Update(yamlFilePath string, namespace string, client plugin.KubernetesConnector) (string, error) {
+
+   return "", nil
+}
 
 
        return service.Name, nil
 }
+
+func (p servicePlugin) Update(yamlFilePath string, namespace string, client plugin.KubernetesConnector) (string, error) {
+
+        return "", nil
+
+}