Skip to content
Snippets Groups Projects
grpc.go 5.27 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) ([]*ppb.PrincipalNetworkDomain,error) {
    
    Manuel Kieweg's avatar
    mvp
    Manuel Kieweg committed
    	ctx := context.Background()
    	resp, err := getAllCore(ctx, addr)
    	if err != nil {
    
    		return nil, err
    
    Manuel Kieweg's avatar
    mvp
    Manuel Kieweg committed
    	}
    
    	return resp.Pnd, nil
    
    Manuel Kieweg's avatar
    mvp
    Manuel Kieweg committed
    }
    
    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 AddPnd(addr, name, description, sbi string) error {
    	coreClient, err := nbi.CoreClient(addr, grpcWithInsecure)
    	if err != nil {
    		return err
    	}
    	ctx := context.Background()
    	req := &pb.SetRequest{
    		Timestamp: time.Now().UnixNano(),
    		Pnd:       []*pb.SetPnd{
    			{
    				Name:        name,
    				Description: description,
    				Sbi:         sbi,
    			},
    		},
    	}
    
    	resp, err := coreClient.Set(ctx, req)
    	if err != nil {
    		return err
    	}
    	log.Info(resp.Status.String())
    	return nil
    }
    
    func GetPnd(addr string, args ...string) (*pb.GetResponse, error) {
    	coreClient, err := nbi.CoreClient(addr, grpcWithInsecure)
    	if err != nil {
    		return nil,err
    	}
    	ctx := context.Background()
    	req := &pb.GetRequest{
    		Timestamp: time.Now().UnixNano(),
    		All:       false,
    		Pid:       args,
    	}
    	return coreClient.Get(ctx, req)
    }
    
    func GetChanges(addr, pnd string) (*ppb.GetResponse, error) {
    	ctx := context.Background()
    	client, err := nbi.PndClient(addr, grpcWithInsecure)
    	if err != nil {
    		return nil, err
    	}
    	req := &ppb.GetRequest{
    		Timestamp: time.Now().UnixNano(),
    		Request: &ppb.GetRequest_Change{
    			Change: &ppb.GetChange{
    				All: true,
    			},
    		},
    		Pid: pnd,
    	}
    	return client.Get(ctx, req)
    }
    
    func Commit(addr, pnd string, cuids ...string) (*ppb.SetResponse,error) {
    	changes := make([]*ppb.SetChange, len(cuids))
    	for i, arg := range cuids {
    		changes[i] = &ppb.SetChange{
    			Cuid: arg,
    			Op:   ppb.SetChange_COMMIT,
    		}
    	}
    	return commitConfirm(addr, pnd, changes)
    }
    
    func Confirm(addr, pnd string, cuids ...string) (*ppb.SetResponse,error) {
    	changes := make([]*ppb.SetChange, len(cuids))
    	for i, arg := range cuids {
    		changes[i] = &ppb.SetChange{
    			Cuid: arg,
    			Op:   ppb.SetChange_CONFIRM,
    		}
    	}
    	return commitConfirm(addr, pnd, changes)
    }
    
    func commitConfirm(addr, pnd string, changes []*ppb.SetChange) (*ppb.SetResponse,error) {
    	ctx := context.Background()
    	client, err := nbi.PndClient(addr, grpcWithInsecure)
    	if err != nil {
    		return nil, err
    	}
    	req := &ppb.SetRequest{
    		Timestamp: time.Now().UnixNano(),
    		Change:    changes,
    		Pid:       pnd,
    	}
    	return client.Set(ctx, req)
    }
    
    
    Manuel Kieweg's avatar
    mvp
    Manuel Kieweg committed
    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) (*ppb.GetResponse,error) {
    
    Manuel Kieweg's avatar
    mvp
    Manuel Kieweg committed
    	pndClient, err := nbi.PndClient(addr, grpcWithInsecure)
    	if err != nil {
    
    		return nil, err
    
    Manuel Kieweg's avatar
    mvp
    Manuel Kieweg committed
    	}
    
    	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()
    
    	return pndClient.Get(ctx, req)
    
    Manuel Kieweg's avatar
    mvp
    Manuel Kieweg committed
    }
    
    
    func Update(addr, did, pid, path, value string) (*ppb.SetResponse, error) {
    
    Manuel Kieweg's avatar
    mvp
    Manuel Kieweg committed
    	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) (*ppb.SetResponse, error) {
    
    Manuel Kieweg's avatar
    mvp
    Manuel Kieweg committed
    	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) (*ppb.SetResponse, error) {
    
    Manuel Kieweg's avatar
    mvp
    Manuel Kieweg committed
    	req := &ppb.ChangeRequest{
    		Id:    did,
    		Path:  path,
    		ApiOp: ppb.ChangeRequest_DELETE,
    	}
    	return sendChangeRequest(addr, pid, req)
    }
    
    
    func sendChangeRequest(addr, pid string, req *ppb.ChangeRequest) (*ppb.SetResponse, error) {
    
    Manuel Kieweg's avatar
    mvp
    Manuel Kieweg committed
    	pndClient, err := nbi.PndClient(addr, grpcWithInsecure)
    	if err != nil {
    
    		return nil, err
    
    Manuel Kieweg's avatar
    mvp
    Manuel Kieweg committed
    	}
    	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
    	}
    
    	return pndClient.Set(ctx, r)
    
    Manuel Kieweg's avatar
    mvp
    Manuel Kieweg committed
    	}