From c7ccf6deae803b2a39ee936042364406b8494d81 Mon Sep 17 00:00:00 2001
From: Shrey Garg <sgarg48@asu.edu>
Date: Wed, 25 May 2022 10:20:12 +0000
Subject: [PATCH] Resolve "Deleting a Device should remove plugin files if
 device is of type plugin/csbi"

See merge request danet/gosdn!318

Co-authored-by: Malte Bauch <malte.bauch@extern.h-da.de>
---
 cli/cmd/deviceRemove.go                      |  2 +-
 controller/nucleus/deviceService.go          |  7 ++++++-
 controller/nucleus/principalNetworkDomain.go | 14 +++++++++-----
 controller/nucleus/sbiService.go             |  9 +++++++++
 4 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/cli/cmd/deviceRemove.go b/cli/cmd/deviceRemove.go
index 6cbdf8125..af1346fba 100644
--- a/cli/cmd/deviceRemove.go
+++ b/cli/cmd/deviceRemove.go
@@ -59,7 +59,7 @@ The device UUID must be specified as a positional argument.`,
 			spinner.Fail(err)
 			return err
 		}
-		spinner.Success("PND has been deleted, ID: ", did.String())
+		spinner.Success("Device has been deleted, ID: ", did.String())
 		return nil
 	},
 }
diff --git a/controller/nucleus/deviceService.go b/controller/nucleus/deviceService.go
index 30caff6dc..c565274e8 100644
--- a/controller/nucleus/deviceService.go
+++ b/controller/nucleus/deviceService.go
@@ -90,7 +90,12 @@ func (s *DeviceService) Delete(deviceToDelete device.Device) error {
 	if err != nil {
 		return err
 	}
-
+	if deviceToDelete.SBI().Type() == spb.Type_TYPE_PLUGIN {
+		err = s.sbiService.Delete(deviceToDelete.SBI())
+		if err != nil {
+			return err
+		}
+	}
 	return nil
 }
 
diff --git a/controller/nucleus/principalNetworkDomain.go b/controller/nucleus/principalNetworkDomain.go
index 4aca33060..3c75a1ae1 100644
--- a/controller/nucleus/principalNetworkDomain.go
+++ b/controller/nucleus/principalNetworkDomain.go
@@ -342,7 +342,7 @@ func (pnd *pndImplementation) removeDevice(id uuid.UUID) error {
 	defer metrics.FinishHook(labels, start, deviceDeletionDurationSecondsTotal, deviceDeletionDurationSeconds)
 	switch d.(type) {
 	case *CsbiDevice:
-		return pnd.handleCsbiDeletion(id)
+		return pnd.handleCsbiDeletion(d)
 	default:
 		return pnd.deviceService.Delete(d)
 	}
@@ -507,20 +507,24 @@ func handleRollbackError(id uuid.UUID, err error) {
 	// TODO: Notion of invalid state needed.
 }
 
-func (pnd *pndImplementation) handleCsbiDeletion(id uuid.UUID) error {
-	log.Infof("csbi deletion triggered for %v", id)
+func (pnd *pndImplementation) handleCsbiDeletion(d device.Device) error {
+	log.Infof("csbi deletion triggered for %v", d.ID().String())
 	ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
 	defer cancel()
 	req := &cpb.DeleteRequest{
 		Timestamp: time.Now().UnixNano(),
-		Did:       []string{id.String()},
+		Did:       []string{d.ID().String()},
 	}
 	resp, err := pnd.csbiClient.Delete(ctx, req)
 	if err != nil {
 		return err
 	}
+	err = pnd.southboundService.Delete(d.SBI())
+	if err != nil {
+		return err
+	}
 	log.WithFields(log.Fields{
-		"uuid":   id,
+		"uuid":   d.ID().String(),
 		"status": resp.Status,
 	}).Info("csbi deleted")
 	return nil
diff --git a/controller/nucleus/sbiService.go b/controller/nucleus/sbiService.go
index a92a3be32..f00247f79 100644
--- a/controller/nucleus/sbiService.go
+++ b/controller/nucleus/sbiService.go
@@ -1,6 +1,8 @@
 package nucleus
 
 import (
+	"os"
+
 	"code.fbi.h-da.de/danet/gosdn/controller/interfaces/southbound"
 	"code.fbi.h-da.de/danet/gosdn/controller/store"
 	"github.com/google/uuid"
@@ -71,6 +73,13 @@ func (s *SbiService) Delete(sbiToDelete southbound.SouthboundInterface) error {
 		return err
 	}
 
+	sbiPlugin, ok := sbiToDelete.(*SouthboundPlugin)
+	if ok {
+		if err := os.RemoveAll(sbiPlugin.Path()); err != nil {
+			return err
+		}
+	}
+
 	return nil
 }
 
-- 
GitLab