Skip to content
Snippets Groups Projects
grpc.go 3.37 KiB
Newer Older
  • Learn to ignore specific revisions
  • Manuel Kieweg's avatar
    mvp
    Manuel Kieweg committed
    package cli
    
    import (
    	ppb "code.fbi.h-da.de/cocsn/api/go/gosdn/pnd"
    	nbi "code.fbi.h-da.de/cocsn/gosdn/northbound/client"
    	"context"
    	log "github.com/sirupsen/logrus"
    	"github.com/spf13/viper"
    	"time"
    
    	pb "code.fbi.h-da.de/cocsn/api/go/gosdn/core"
    	"google.golang.org/grpc"
    )
    
    // TODO: Delete once proper certs are set up
    var grpcWithInsecure = grpc.WithInsecure()
    
    func Init(addr string) error {
    	ctx := context.Background()
    	resp, err := getAllCore(ctx, addr)
    	if err != nil {
    		return err
    	}
    	if len(resp.Pnd) > 0 {
    		pid := resp.Pnd[0].Id
    		viper.Set("CLI_PND", pid)
    		log.Infof("PND: %v", pid)
    		if len(resp.Pnd[0].Sbi) != 0 {
    			sbi := resp.Pnd[0].Sbi[0].Id
    			viper.Set("CLI_SBI", sbi)
    			log.Infof("SBI: %v", sbi)
    		}
    	}
    	return nil
    }
    
    func GetIds(addr string) error {
    	ctx := context.Background()
    	resp, err := getAllCore(ctx, addr)
    	if err != nil {
    		return err
    	}
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	for i, pnd := range resp.Pnd {
    
    Manuel Kieweg's avatar
    mvp
    Manuel Kieweg committed
    		log.Infof("PND %v: %v", i+1, pnd.Id)
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    		for j, sbi := range pnd.Sbi {
    
    Manuel Kieweg's avatar
    mvp
    Manuel Kieweg committed
    			log.Infof("\tSBI %v: %v", j+1, sbi.Id)
    		}
    	}
    	return nil
    }
    
    func getAllCore(ctx context.Context, addr string) (*pb.GetResponse, error) {
    	coreClient, err := nbi.CoreClient(addr, grpcWithInsecure)
    	if err != nil {
    		return nil, err
    	}
    	req := &pb.GetRequest{
    		Timestamp: time.Now().UnixNano(),
    		All:       true,
    	}
    	return coreClient.Get(ctx, req)
    }
    
    func AddDevice(addr, username, password, sbi, pnd, deviceAddress string) error {
    	pndClient, err := nbi.PndClient(addr, grpcWithInsecure)
    	if err != nil {
    		return err
    	}
    
    	req := &ppb.SetRequest{
    		Timestamp: time.Now().UnixNano(),
    		Ond: []*ppb.SetOnd{
    			{
    				Address:  deviceAddress,
    				Username: username,
    				Password: password,
    				Sbi: &ppb.SouthboundInterface{
    					Type: 0,
    				},
    			},
    		},
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    		Pid: pnd,
    
    Manuel Kieweg's avatar
    mvp
    Manuel Kieweg committed
    	}
    	ctx := context.Background()
    	resp, err := pndClient.Set(ctx, req)
    	if err != nil {
    		return err
    	}
    	log.Info(resp.String())
    	return nil
    }
    
    func GetDevice(addr, pid, path string, did ...string) error {
    	pndClient, err := nbi.PndClient(addr, grpcWithInsecure)
    	if err != nil {
    		return err
    	}
    
    	var all bool
    	if len(did) != 0 {
    		all = true
    	}
    
    	req := &ppb.GetRequest{
    		Timestamp: time.Now().UnixNano(),
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    		Request: &ppb.GetRequest_Ond{
    
    Manuel Kieweg's avatar
    mvp
    Manuel Kieweg committed
    			Ond: &ppb.GetOnd{
    				All: all,
    				Did: did,
    			},
    		},
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    		Pid: pid,
    
    Manuel Kieweg's avatar
    mvp
    Manuel Kieweg committed
    	}
    	ctx := context.Background()
    	resp, err := pndClient.Get(ctx, req)
    	if err != nil {
    		return err
    	}
    	log.Info(resp.String())
    	return nil
    }
    
    func Update(addr, did, pid, path, value string) error {
    	req := &ppb.ChangeRequest{
    		Id:    did,
    		Path:  path,
    		Value: value,
    		ApiOp: ppb.ChangeRequest_UPDATE,
    	}
    	return sendChangeRequest(addr, pid, req)
    }
    
    func Replace(addr, did, pid, path, value string) error {
    	req := &ppb.ChangeRequest{
    		Id:    did,
    		Path:  path,
    		Value: value,
    		ApiOp: ppb.ChangeRequest_REPLACE,
    	}
    	return sendChangeRequest(addr, pid, req)
    }
    
    func Delete(addr, did, pid, path string) error {
    	req := &ppb.ChangeRequest{
    		Id:    did,
    		Path:  path,
    		ApiOp: ppb.ChangeRequest_DELETE,
    	}
    	return sendChangeRequest(addr, pid, req)
    }
    
    func sendChangeRequest(addr, pid string, req *ppb.ChangeRequest) error {
    	pndClient, err := nbi.PndClient(addr, grpcWithInsecure)
    	if err != nil {
    		return err
    	}
    	ctx := context.Background()
    	r := &ppb.SetRequest{
    		Timestamp:     time.Now().UnixNano(),
    		ChangeRequest: []*ppb.ChangeRequest{req},
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    		Pid:           pid,
    
    Manuel Kieweg's avatar
    mvp
    Manuel Kieweg committed
    	}
    	resp, err := pndClient.Set(ctx, r)
    	if err != nil {
    		return err
    	}
    	log.Info(resp.String())
    	return nil
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    }