SEBA-261
refactor to support serialize/deserialize

Change-Id: Icdc0bc2bb06a9d1c3240c0f46e1de02953a0b017
diff --git a/client/main.go b/client/main.go
index af87ec7..8d8ea4c 100644
--- a/client/main.go
+++ b/client/main.go
@@ -30,32 +30,49 @@
 )
 
 func main() {
+	/* COMMAND FLAGS */
+	output := flag.Bool("output", false, "dump output")
 	echo := flag.Bool("e", false, "echo")
 	message := flag.String("message", "ping", "message to be echoed back")
 	create := flag.Bool("c", false, "create?")
 	addOlt := flag.Bool("s", false, "addOlt?")
 	provOnt := flag.Bool("o", false, "provisionOnt?")
-	clli := flag.String("clli", "", "clli of abstract chassis")
+	deleteOnt := flag.Bool("d", false, "deleteOnt")
+	/* END COMMAND FLAGS */
+
+	/* CREATE CHASSIS FLAGS */
 	xosAddress := flag.String("xos_address", "", "xos address")
 	xosPort := flag.Uint("xos_port", 0, "xos port")
 	rack := flag.Uint("rack", 1, "rack number for chassis")
 	shelf := flag.Uint("shelf", 1, "shelf number for chassis")
+	/* END CREATE CHASSIS FLAGS */
+
+	/* ADD OLT FLAGS */
 	oltAddress := flag.String("olt_address", "", "ip address for olt chassis")
 	oltPort := flag.Uint("olt_port", 0, "listen port for olt chassis")
 	name := flag.String("name", "", "friendly name for olt chassis")
 	driver := flag.String("driver", "", "driver to use with olt chassis")
 	oltType := flag.String("type", "", "olt chassis type")
+	/* END ADD OLT FLAGS */
+
+	/* PROVISION / DELETE ONT FLAGS */
 	slot := flag.Uint("slot", 1, "slot number 1-16 to provision ont to")
 	port := flag.Uint("port", 1, "port number 1-16 to provision ont to")
 	ont := flag.Uint("ont", 1, "ont number 1-64")
 	serial := flag.String("serial", "", "serial number of ont")
+	/* END PROVISION / DELETE ONT FLAGS */
+
+	/*GENERIC FLAGS */
+	clli := flag.String("clli", "", "clli of abstract chassis")
 	useSsl := flag.Bool("ssl", false, "use ssl")
 	useAuth := flag.Bool("auth", false, "use auth")
 	crtFile := flag.String("cert", "cert/server.crt", "Public cert for server to establish tls session")
 	serverAddressPort := flag.String("server", "localhost:7777", "address and port of AbstractOLT server")
 	fqdn := flag.String("fqdn", "", "FQDN of the service to match what is in server.crt")
+	/*GENERIC FLAGS */
 
 	flag.Parse()
+
 	if *useSsl {
 		if *fqdn == "" {
 			fqdn = &(strings.Split(*serverAddressPort, ":")[0])
@@ -63,16 +80,24 @@
 		}
 	}
 
-	if (*echo && *addOlt) || (*echo && *create) || (*echo && *provOnt) || (*create && *addOlt) || (*create && *provOnt) || (*addOlt && *provOnt) {
-		fmt.Println("You can only call one method at a time")
+	cmdFlags := []*bool{echo, addOlt, create, provOnt, deleteOnt, output}
+	cmdCount := 0
+	for _, flag := range cmdFlags {
+		if *flag {
+			cmdCount++
+		}
+	}
+	if cmdCount > 1 {
+		fmt.Println("CMD You can only call one method at a time")
 		usage()
 		return
 	}
-	if !(*create || *provOnt || *addOlt || *echo) {
-		fmt.Println("You didn't specify an operation to perform")
+	if cmdCount < 1 {
+		fmt.Println("CMD You didn't specify an operation to perform")
 		usage()
 		return
 	}
+
 	var conn *grpc.ClientConn
 	var err error
 
@@ -113,6 +138,10 @@
 		provisionONT(c, clli, slot, port, ont, serial)
 	} else if *echo {
 		ping(c, *message)
+	} else if *output {
+		Output(c)
+	} else if *deleteOnt {
+		deleteONT(c, clli, slot, port, ont, serial)
 	}
 
 }
@@ -135,6 +164,17 @@
 func (a *Authentication) RequireTransportSecurity() bool {
 	return true
 }
+func Output(c api.AbstractOLTClient) error {
+	response, err := c.Output(context.Background(), &api.OutputMessage{Something: "wtf"})
+	if err != nil {
+		fmt.Printf("Error when calling Echo: %s", err)
+		return err
+	}
+	log.Printf("Response from server: %v", response.GetSuccess())
+
+	return nil
+}
+
 func ping(c api.AbstractOLTClient, message string) error {
 	response, err := c.Echo(context.Background(), &api.EchoMessage{Ping: message})
 	if err != nil {
@@ -205,6 +245,22 @@
 
 	return nil
 }
+func deleteONT(c api.AbstractOLTClient, clli *string, slot *uint, port *uint, ont *uint, serial *string) error {
+	fmt.Println("clli", *clli)
+	fmt.Println("slot", *slot)
+	fmt.Println("port", *port)
+	fmt.Println("ont", *ont)
+	fmt.Println("serial", *serial)
+	res, err := c.DeleteOnt(context.Background(), &api.DeleteOntMessage{CLLI: *clli, SlotNumber: int32(*slot), PortNumber: int32(*port), OntNumber: int32(*ont), SerialNumber: *serial})
+	if err != nil {
+		debug.PrintStack()
+		fmt.Printf("Error when calling ProvsionOnt %s", err)
+		return err
+	}
+	log.Printf("Response from server: %t", res.GetSuccess())
+	return nil
+}
+
 func usage() {
 	var output = `
 	Usage ./client -server=[serverAddress:port] -[methodFlag] params
@@ -240,7 +296,18 @@
 	 -port OLT_PORT_NUMBER [1-16]
 	 -ont ONT_NUMBER [1-64]
 	 -serial ONT_SERIAL_NUM
-	 e.g. ./client -server=localhost:7777 -o -clli=MY_CLLI -slot=1 -port=1 -ont=22 -serial=aer900jasdf `
+	 e.g. ./client -server=localhost:7777 -o -clli=MY_CLLI -slot=1 -port=1 -ont=22 -serial=aer900jasdf
+   -d delete ont - removes ont from service
+      params:
+	 -clli CLLI_NAME
+	 -slot SLOT_NUMBER [1-16]
+	 -port OLT_PORT_NUMBER [1-16]
+	 -ont ONT_NUMBER [1-64]
+	 -serial ONT_SERIAL_NUM
+	 e.g. ./client -server=localhost:7777 -d -clli=MY_CLLI -slot=1 -port=1 -ont=22 -serial=aer900jasdf
+    -output (TEMPORARY) causes AbstractOLT to serialize all chassis to JSON file in $WorkingDirectory/backups
+         e.g. ./client -server=localhost:7777 -output
+	 `
 
 	fmt.Println(output)
 }