Skip to content
Snippets Groups Projects
device.go 3.08 KiB
Newer Older
  • Learn to ignore specific revisions
  • Manuel Kieweg's avatar
    Manuel Kieweg committed
    package nucleus
    
    import (
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	tpb "code.fbi.h-da.de/cocsn/api/go/gosdn/transport"
    
    	"code.fbi.h-da.de/cocsn/gosdn/interfaces/device"
    	"code.fbi.h-da.de/cocsn/gosdn/interfaces/southbound"
    	"code.fbi.h-da.de/cocsn/gosdn/interfaces/transport"
    
    	"github.com/docker/docker/pkg/namesgenerator"
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	"github.com/google/uuid"
    	"github.com/openconfig/ygot/ygot"
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	"google.golang.org/protobuf/proto"
    
    // NewDevice creates a Device
    func NewDevice(name string, opt *tpb.TransportOption, sbi southbound.SouthboundInterface) (device.Device, error) {
    	t, err := NewTransport(opt, sbi)
    	if err != nil {
    		return nil, err
    	}
    
    	if name == "" {
    		name = namesgenerator.GetRandomName(0)
    	}
    
    
    	root, err := ygot.DeepCopy(sbi.Schema().Root)
    	if err != nil {
    		return nil, err
    	}
    
    	if opt.Csbi {
    		return &CsbiDevice{
    			CommonDevice: CommonDevice{
    				UUID:      uuid.New(),
    
    				sbi:       sbi,
    				transport: t,
    				name:      name,
    			},
    		}, nil
    	}
    
    
    	return &CommonDevice{
    		UUID:      uuid.New(),
    
    		sbi:       sbi,
    		transport: t,
    		name:      name,
    	}, nil
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    // CommonDevice represents an OND
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    type CommonDevice struct {
    
    	// UUID represents the Devices UUID
    	UUID uuid.UUID
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	// Device embeds a ygot.GoStruct containing the device details
    
    	ygot.GoStruct
    
    	// SBI is the device's southbound interface implementation
    
    	sbi southbound.SouthboundInterface
    
    
    	// Transport is the device's Transport implementation
    
    	transport transport.Transport
    
    
    	// Name is the device's human readable name
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	name string
    
    // ID returns the UUID of the Device
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    func (d *CommonDevice) ID() uuid.UUID {
    
    	return d.UUID
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    // Model returns the ygot representation of the Device
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    func (d *CommonDevice) Model() ygot.GoStruct {
    	return d.GoStruct
    }
    
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    // Transport returns the Transport of the device
    
    func (d *CommonDevice) Transport() transport.Transport {
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	return d.transport
    }
    
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    // Name returns the name of the device
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    func (d *CommonDevice) Name() string {
    	return d.name
    }
    
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    // SBI returns the sbi of the Device
    
    func (d *CommonDevice) SBI() southbound.SouthboundInterface {
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	return d.sbi
    }
    
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    // SetTransport sets the Device's Transport
    
    func (d *CommonDevice) SetTransport(t transport.Transport) {
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	d.transport = t
    }
    
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    // SetName sets the Device's name
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    func (d *CommonDevice) SetName(n string) {
    	d.name = n
    }
    
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    // SetSBI sets the Device's SBI
    
    func (d *CommonDevice) SetSBI(sbi southbound.SouthboundInterface) {
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	d.sbi = sbi
    }
    
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    // ProcessResponse processes a response for the Device
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    func (d *CommonDevice) ProcessResponse(resp proto.Message) error {
    	return d.transport.ProcessResponse(resp, d.GoStruct, d.sbi.Schema())
    }
    
    
    type CsbiDevice struct {
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	CommonDevice
    }
    
    // ID returns the UUID of the Device
    
    func (d *CsbiDevice) ID() uuid.UUID {
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	return d.UUID
    }
    
    
    func (d *CsbiDevice) Model() ygot.GoStruct {
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	return d.GoStruct
    }
    
    
    func (d *CsbiDevice) Transport() transport.Transport {
    
    	return d.transport
    
    func (d *CsbiDevice) Name() string {
    
    	return d.name
    
    func (d *CsbiDevice) SBI() southbound.SouthboundInterface {
    
    	return d.sbi
    
    func (d *CsbiDevice) ProcessResponse(resp proto.Message) error {
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	return d.transport.ProcessResponse(resp, d.GoStruct, d.sbi.Schema())