Newer
Older
Andre Sterba
committed
package main
import (
"context"
"fmt"
"time"
mnepb "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement"
Andre Sterba
committed
"code.fbi.h-da.de/danet/gosdn/api/go/gosdn/topology"
"code.fbi.h-da.de/danet/gosdn/application-framework/models"
"code.fbi.h-da.de/danet/gosdn/models/generated/arista"
"github.com/google/uuid"
"github.com/openconfig/ygot/ygot"
)
// NetworkElement is a network element.
type NetworkElement struct {
// UUID represents the network element's UUID
Andre Sterba
committed
UUID uuid.UUID
// Name is the network element's human readable Name
Andre Sterba
committed
Name string
// Model embeds a ygot.GoStruct containing the network element details
Andre Sterba
committed
Model arista.Device
}
// NewNetworkElement creates a new network element.
func NewNetworkElement(id uuid.UUID, name string, networkelementModel string) *NetworkElement {
mne := &NetworkElement{
Andre Sterba
committed
UUID: id,
Model: arista.Device{},
Name: name,
}
// Create 'root' path to be able to load the whole model from the store.
path, err := ygot.StringToPath("/", ygot.StructuredPath)
if err != nil {
panic(err)
}
// Use unmarshall from the network element's SBI to unmarshall ygot json in go struct.
err = models.Unmarshal([]byte(networkelementModel), path, &mne.Model)
Andre Sterba
committed
if err != nil {
panic(err)
}
Andre Sterba
committed
}
func adjustNodePortsToMatchConfiguration(networkElementServer mnepb.NetworkElementServiceClient, node *topology.Node, port *topology.Port) {
Andre Sterba
committed
nodeUUID := uuid.MustParse(node.Id)
adjustInterfacesOfNetworkElement(
networkElementServer,
Andre Sterba
committed
nodeUUID,
port,
)
}
func adjustInterfacesOfNetworkElement(networkElementServer mnepb.NetworkElementServiceClient, elementUUID uuid.UUID, portConfiguration *topology.Port) {
Andre Sterba
committed
ctx := context.Background()
request := &mnepb.GetNetworkElementRequest{
Timestamp: time.Now().UnixNano(),
NetworkElementId: elementUUID.String(),
Andre Sterba
committed
}
response, err := networkElementServer.Get(ctx, request)
Andre Sterba
committed
if err != nil {
fmt.Printf("Error %+v\n ", err)
return
}
fmt.Printf("[APP] ID: %v, NetworkElement: %+v \n", response.NetworkElement.Id, response.NetworkElement)
Andre Sterba
committed
mne := NewNetworkElement(uuid.MustParse(response.NetworkElement.Id), response.NetworkElement.Name, response.NetworkElement.Model)
Andre Sterba
committed
fmt.Printf("[APP] NetworkElement.Hostname %s \n", *mne.Model.System.Config.Hostname)
Andre Sterba
committed
err = enableRouting(&mne.Model)
Andre Sterba
committed
if err != nil {
panic(err)
}
setIPOnInterface(
&mne.Model,
Andre Sterba
committed
portConfiguration.Name,
portConfiguration.Configuration.Ip,
int(portConfiguration.Configuration.PrefixLength),
)
modelAsString, err := models.GetModelAsString(&mne.Model)
Andre Sterba
committed
if err != nil {
panic(err)
}
requestUpdate := &mnepb.UpdateNetworkElementRequest{
Andre Sterba
committed
Timestamp: time.Now().UnixNano(),
NetworkElement: &mnepb.ManagedNetworkElement{
Id: mne.UUID.String(),
Name: mne.Name,
Andre Sterba
committed
Model: modelAsString,
},
}
updateResponse, err := networkElementServer.Update(ctx, requestUpdate)
Andre Sterba
committed
if err != nil {
panic(err)
}
fmt.Printf("[APP] Update NetworkElement %s response: %+v", mne.UUID.String(), updateResponse)
Andre Sterba
committed
}
func adjustNodeRoutesToMatchConfiguration(networkElementServer mnepb.NetworkElementServiceClient, nodeID string, route *topology.Route) {
Andre Sterba
committed
ctx := context.Background()
request := &mnepb.GetNetworkElementRequest{
Timestamp: time.Now().UnixNano(),
NetworkElementId: nodeID,
Andre Sterba
committed
}
response, err := networkElementServer.Get(ctx, request)
Andre Sterba
committed
if err != nil {
fmt.Printf("Error %+v\n ", err)
return
}
fmt.Printf("[APP] ID: %v, NetworkElement: %+v \n", response.NetworkElement.Id, response.NetworkElement)
Andre Sterba
committed
mne := NewNetworkElement(uuid.MustParse(response.NetworkElement.Id), response.NetworkElement.Name, response.NetworkElement.Model)
Andre Sterba
committed
fmt.Printf("[APP] NetworkElement.Hostname %s \n", *mne.Model.System.Config.Hostname)
Andre Sterba
committed
setRoutingTable(&mne.Model, route.TargetIPRange, route.NextHopIP)
Andre Sterba
committed
modelAsString, err := models.GetModelAsString(&mne.Model)
Andre Sterba
committed
if err != nil {
panic(err)
}
requestUpdate := &mnepb.UpdateNetworkElementRequest{
Andre Sterba
committed
Timestamp: time.Now().UnixNano(),
NetworkElement: &mnepb.ManagedNetworkElement{
Id: mne.UUID.String(),
Name: mne.Name,
Andre Sterba
committed
Model: modelAsString,
},
}
updateResponse, err := networkElementServer.Update(ctx, requestUpdate)
Andre Sterba
committed
if err != nil {
panic(err)
}
fmt.Printf("[APP] Update NetworkElement %s response: %+v", mne.UUID.String(), updateResponse)