From 8d7843cea47a8cfb38b314e543dffa07a51139a6 Mon Sep 17 00:00:00 2001 From: Serge Bazanski Date: Thu, 4 Oct 2018 10:37:36 +0100 Subject: [PATCH] initial commit --- config.proto | 22 ++++++++++++++++ control.proto | 64 +++++++++++++++++++++++++++++++++++++++++++++++ main.go | 33 ++++++++++++++++++++++++ proto/.gitignore | 2 ++ proto/generate.go | 4 +++ service.go | 7 ++++++ 6 files changed, 132 insertions(+) create mode 100644 config.proto create mode 100644 control.proto create mode 100644 main.go create mode 100644 proto/.gitignore create mode 100644 proto/generate.go create mode 100644 service.go diff --git a/config.proto b/config.proto new file mode 100644 index 00000000..4408a3be --- /dev/null +++ b/config.proto @@ -0,0 +1,22 @@ +syntax = "proto3"; + +message Config { + repeated Switch switch = 1; +}; + +message Switch { + string name = 1; + + enum Connector { + CONNECTOR_INVALID = 0; + CONNECTOR_M6220 = 1; + CONNECTOR_ARISTA = 2; + }; + Connector connector = 2; + string address = 3; + repeated SwitchPort managed_port = 4; +}; + +message SwitchPort { + string name = 1; +}; diff --git a/control.proto b/control.proto new file mode 100644 index 00000000..46cd93a1 --- /dev/null +++ b/control.proto @@ -0,0 +1,64 @@ +syntax = "proto3"; +package connector; + +message GetPortsRequest { +}; + +message SwitchPort { + enum Speed { + SPEED_INVALID = 0; + SPEED_100M = 1; + SPEED_1G = 2; + SPEED_10G = 3; + }; + string name = 1; + Speed speed = 2; + enum LinkState { + LINKSTATE_INVALID = 0; + LINKSTATE_DOWN = 1; + LINKSTATE_UP = 2; + }; + LinkState link_state = 3; + enum PortMode { + PORTMODE_INVALID = 0; + // Interface is bridged to a VLAN, untagged. + PORTMODE_SWITCHPORT_UNTAGGED = 1; + // Interfaces is bridged to several tagged 802.1q VLANs. + PORTMODE_SWITCHPORT_TAGGED = 2; + // Interface is in 'generic', both tagged 802.1q and untagged mode. + PORTMODE_SWITCHPORT_GENERIC = 3; + // Interface is routed, ie routes packets from a separate L3 network + // and the Switch is the default gateway for machines in this network. + PORTMODE_ROUTED = 4; + // Interface is in a configuration state that cannot be clearly stated + // in terms of this enum, and should be reconfigured. + PORTMODE_MANGLED = 5; + }; + PortMode port_mode = 4; + // For PORTMODE_SWITCHPORT_UNTAGGED and PORTMODE_SWITCHPORT_GENERIC, the + // VLAN ID that this interface is natively bridged to. + int32 vlan_native = 5; + // For PORTMODE_SWITCHPORT_TAGGED and PORTMODE_SWITCHPORT_GENERIC, the VLAN + // IDs that the interface is bridged to using 802.1q tags. + repeated int32 vlan_tagged = 6; + // For PORTMODE_ROUTED + repeated string prefixes = 7; + // Interface MTU + int32 mtu = 8; + enum SpanningTreeMode { + SPANNING_TREE_MODE_INVALID = 0; + // Send STP BPDU, on timeout switch to Forwarding. + SPANNING_TREE_MODE_AUTO_PORTFAST = 1; + // Switch to Forwarding immediately on link up. + SPANNING_TREE_MODE_PORTFAST = 2; + }; + SpanningTreeMode spanning_tree_mode = 9; +}; + +message GetPortsResponse { + repeated SwitchPort ports = 1; +}; + +service SwitchControl { + rpc GetPorts(GetPortsRequest) returns (GetPortsResponse); +}; diff --git a/main.go b/main.go new file mode 100644 index 00000000..0314b7d3 --- /dev/null +++ b/main.go @@ -0,0 +1,33 @@ +package main + +import ( + "flag" + "io/ioutil" + + "github.com/golang/glog" + "github.com/golang/protobuf/proto" + + confpb "code.hackerspace.pl/q3k/topo/proto/config" +) + +var ( + flagConfigPath string +) + +func init() { + flag.Set("logtostderr", "true") +} + +func main() { + flag.StringVar(&flagConfigPath, "config_path", "./topo.pb.text", "Text proto configuration of Topo (per config.proto)") + flag.Parse() + + data, err := ioutil.ReadFile(flagConfigPath) + if err != nil { + glog.Exitf("Could not read config: %v", err) + } + + config := confpb.Config{} + proto.UnmarshalText(string(data), &config) + glog.Infof("%+v", config) +} diff --git a/proto/.gitignore b/proto/.gitignore new file mode 100644 index 00000000..8a825df3 --- /dev/null +++ b/proto/.gitignore @@ -0,0 +1,2 @@ +config +control diff --git a/proto/generate.go b/proto/generate.go new file mode 100644 index 00000000..4456a693 --- /dev/null +++ b/proto/generate.go @@ -0,0 +1,4 @@ +//go:generate protoc -I.. ../control.proto --go_out=plugins=grpc:control +//go:generate protoc -I.. ../config.proto --go_out=plugins=grpc:config + +package proto diff --git a/service.go b/service.go new file mode 100644 index 00000000..ab9e10a0 --- /dev/null +++ b/service.go @@ -0,0 +1,7 @@ +package main + +import confpb "code.hackerspace.pl/q3k/topo/proto/config" + +type service struct { + config *confpb.Config +}