diff --git a/go/svc/cmc-proxy/proto/.gitignore b/go/svc/cmc-proxy/proto/.gitignore
new file mode 100644
index 0000000..3cf12ab
--- /dev/null
+++ b/go/svc/cmc-proxy/proto/.gitignore
@@ -0,0 +1 @@
+proxy.pb.go
diff --git a/go/svc/cmc-proxy/proto/proxy.pb.go b/go/svc/cmc-proxy/proto/proxy.pb.go
deleted file mode 100644
index ff1d00b..0000000
--- a/go/svc/cmc-proxy/proto/proxy.pb.go
+++ /dev/null
@@ -1,194 +0,0 @@
-// Code generated by protoc-gen-go. DO NOT EDIT.
-// source: proxy.proto
-
-package proto
-
-import (
-	fmt "fmt"
-	proto "github.com/golang/protobuf/proto"
-	context "golang.org/x/net/context"
-	grpc "google.golang.org/grpc"
-	math "math"
-)
-
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
-
-type GetKVMDataRequest struct {
-	BladeNum             int64    `protobuf:"varint,1,opt,name=blade_num,json=bladeNum,proto3" json:"blade_num,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *GetKVMDataRequest) Reset()         { *m = GetKVMDataRequest{} }
-func (m *GetKVMDataRequest) String() string { return proto.CompactTextString(m) }
-func (*GetKVMDataRequest) ProtoMessage()    {}
-func (*GetKVMDataRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_700b50b08ed8dbaf, []int{0}
-}
-
-func (m *GetKVMDataRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetKVMDataRequest.Unmarshal(m, b)
-}
-func (m *GetKVMDataRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetKVMDataRequest.Marshal(b, m, deterministic)
-}
-func (m *GetKVMDataRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetKVMDataRequest.Merge(m, src)
-}
-func (m *GetKVMDataRequest) XXX_Size() int {
-	return xxx_messageInfo_GetKVMDataRequest.Size(m)
-}
-func (m *GetKVMDataRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetKVMDataRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetKVMDataRequest proto.InternalMessageInfo
-
-func (m *GetKVMDataRequest) GetBladeNum() int64 {
-	if m != nil {
-		return m.BladeNum
-	}
-	return 0
-}
-
-type GetKVMDataResponse struct {
-	Arguments            []string `protobuf:"bytes,1,rep,name=arguments,proto3" json:"arguments,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *GetKVMDataResponse) Reset()         { *m = GetKVMDataResponse{} }
-func (m *GetKVMDataResponse) String() string { return proto.CompactTextString(m) }
-func (*GetKVMDataResponse) ProtoMessage()    {}
-func (*GetKVMDataResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_700b50b08ed8dbaf, []int{1}
-}
-
-func (m *GetKVMDataResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_GetKVMDataResponse.Unmarshal(m, b)
-}
-func (m *GetKVMDataResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_GetKVMDataResponse.Marshal(b, m, deterministic)
-}
-func (m *GetKVMDataResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetKVMDataResponse.Merge(m, src)
-}
-func (m *GetKVMDataResponse) XXX_Size() int {
-	return xxx_messageInfo_GetKVMDataResponse.Size(m)
-}
-func (m *GetKVMDataResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_GetKVMDataResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_GetKVMDataResponse proto.InternalMessageInfo
-
-func (m *GetKVMDataResponse) GetArguments() []string {
-	if m != nil {
-		return m.Arguments
-	}
-	return nil
-}
-
-func init() {
-	proto.RegisterType((*GetKVMDataRequest)(nil), "proto.GetKVMDataRequest")
-	proto.RegisterType((*GetKVMDataResponse)(nil), "proto.GetKVMDataResponse")
-}
-
-func init() { proto.RegisterFile("proxy.proto", fileDescriptor_700b50b08ed8dbaf) }
-
-var fileDescriptor_700b50b08ed8dbaf = []byte{
-	// 156 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x2e, 0x28, 0xca, 0xaf,
-	0xa8, 0xd4, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x05, 0x53, 0x4a, 0x06, 0x5c, 0x82, 0xee,
-	0xa9, 0x25, 0xde, 0x61, 0xbe, 0x2e, 0x89, 0x25, 0x89, 0x41, 0xa9, 0x85, 0xa5, 0xa9, 0xc5, 0x25,
-	0x42, 0xd2, 0x5c, 0x9c, 0x49, 0x39, 0x89, 0x29, 0xa9, 0xf1, 0x79, 0xa5, 0xb9, 0x12, 0x8c, 0x0a,
-	0x8c, 0x1a, 0xcc, 0x41, 0x1c, 0x60, 0x01, 0xbf, 0xd2, 0x5c, 0x25, 0x23, 0x2e, 0x21, 0x64, 0x1d,
-	0xc5, 0x05, 0xf9, 0x79, 0xc5, 0xa9, 0x42, 0x32, 0x5c, 0x9c, 0x89, 0x45, 0xe9, 0xa5, 0xb9, 0xa9,
-	0x79, 0x25, 0xc5, 0x12, 0x8c, 0x0a, 0xcc, 0x1a, 0x9c, 0x41, 0x08, 0x01, 0x23, 0x5f, 0x2e, 0x0e,
-	0x67, 0x5f, 0xe7, 0x00, 0x90, 0xf5, 0x42, 0x8e, 0x5c, 0x5c, 0x08, 0xfd, 0x42, 0x12, 0x10, 0xe7,
-	0xe8, 0x61, 0x38, 0x42, 0x4a, 0x12, 0x8b, 0x0c, 0xc4, 0xb2, 0x24, 0x36, 0xb0, 0x8c, 0x31, 0x20,
-	0x00, 0x00, 0xff, 0xff, 0x09, 0x00, 0x2b, 0x54, 0xd1, 0x00, 0x00, 0x00,
-}
-
-// Reference imports to suppress errors if they are not otherwise used.
-var _ context.Context
-var _ grpc.ClientConn
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the grpc package it is being compiled against.
-const _ = grpc.SupportPackageIsVersion4
-
-// CMCProxyClient is the client API for CMCProxy service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
-type CMCProxyClient interface {
-	GetKVMData(ctx context.Context, in *GetKVMDataRequest, opts ...grpc.CallOption) (*GetKVMDataResponse, error)
-}
-
-type cMCProxyClient struct {
-	cc *grpc.ClientConn
-}
-
-func NewCMCProxyClient(cc *grpc.ClientConn) CMCProxyClient {
-	return &cMCProxyClient{cc}
-}
-
-func (c *cMCProxyClient) GetKVMData(ctx context.Context, in *GetKVMDataRequest, opts ...grpc.CallOption) (*GetKVMDataResponse, error) {
-	out := new(GetKVMDataResponse)
-	err := c.cc.Invoke(ctx, "/proto.CMCProxy/GetKVMData", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-// CMCProxyServer is the server API for CMCProxy service.
-type CMCProxyServer interface {
-	GetKVMData(context.Context, *GetKVMDataRequest) (*GetKVMDataResponse, error)
-}
-
-func RegisterCMCProxyServer(s *grpc.Server, srv CMCProxyServer) {
-	s.RegisterService(&_CMCProxy_serviceDesc, srv)
-}
-
-func _CMCProxy_GetKVMData_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(GetKVMDataRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(CMCProxyServer).GetKVMData(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/proto.CMCProxy/GetKVMData",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(CMCProxyServer).GetKVMData(ctx, req.(*GetKVMDataRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-var _CMCProxy_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "proto.CMCProxy",
-	HandlerType: (*CMCProxyServer)(nil),
-	Methods: []grpc.MethodDesc{
-		{
-			MethodName: "GetKVMData",
-			Handler:    _CMCProxy_GetKVMData_Handler,
-		},
-	},
-	Streams:  []grpc.StreamDesc{},
-	Metadata: "proxy.proto",
-}
diff --git a/go/svc/m6220-proxy/proto/.gitignore b/go/svc/m6220-proxy/proto/.gitignore
new file mode 100644
index 0000000..3cf12ab
--- /dev/null
+++ b/go/svc/m6220-proxy/proto/.gitignore
@@ -0,0 +1 @@
+proxy.pb.go
diff --git a/go/svc/m6220-proxy/proto/proxy.pb.go b/go/svc/m6220-proxy/proto/proxy.pb.go
deleted file mode 100644
index 148b878..0000000
--- a/go/svc/m6220-proxy/proto/proxy.pb.go
+++ /dev/null
@@ -1,203 +0,0 @@
-// Code generated by protoc-gen-go. DO NOT EDIT.
-// source: proxy.proto
-
-package proto
-
-import (
-	fmt "fmt"
-	proto "github.com/golang/protobuf/proto"
-	context "golang.org/x/net/context"
-	grpc "google.golang.org/grpc"
-	math "math"
-)
-
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
-
-type RunCommandRequest struct {
-	Command              string   `protobuf:"bytes,1,opt,name=command,proto3" json:"command,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *RunCommandRequest) Reset()         { *m = RunCommandRequest{} }
-func (m *RunCommandRequest) String() string { return proto.CompactTextString(m) }
-func (*RunCommandRequest) ProtoMessage()    {}
-func (*RunCommandRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_700b50b08ed8dbaf, []int{0}
-}
-
-func (m *RunCommandRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_RunCommandRequest.Unmarshal(m, b)
-}
-func (m *RunCommandRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_RunCommandRequest.Marshal(b, m, deterministic)
-}
-func (m *RunCommandRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_RunCommandRequest.Merge(m, src)
-}
-func (m *RunCommandRequest) XXX_Size() int {
-	return xxx_messageInfo_RunCommandRequest.Size(m)
-}
-func (m *RunCommandRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_RunCommandRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_RunCommandRequest proto.InternalMessageInfo
-
-func (m *RunCommandRequest) GetCommand() string {
-	if m != nil {
-		return m.Command
-	}
-	return ""
-}
-
-type RunCommandResponse struct {
-	EffectiveCommand     string   `protobuf:"bytes,1,opt,name=effective_command,json=effectiveCommand,proto3" json:"effective_command,omitempty"`
-	Lines                []string `protobuf:"bytes,2,rep,name=lines,proto3" json:"lines,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *RunCommandResponse) Reset()         { *m = RunCommandResponse{} }
-func (m *RunCommandResponse) String() string { return proto.CompactTextString(m) }
-func (*RunCommandResponse) ProtoMessage()    {}
-func (*RunCommandResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_700b50b08ed8dbaf, []int{1}
-}
-
-func (m *RunCommandResponse) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_RunCommandResponse.Unmarshal(m, b)
-}
-func (m *RunCommandResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_RunCommandResponse.Marshal(b, m, deterministic)
-}
-func (m *RunCommandResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_RunCommandResponse.Merge(m, src)
-}
-func (m *RunCommandResponse) XXX_Size() int {
-	return xxx_messageInfo_RunCommandResponse.Size(m)
-}
-func (m *RunCommandResponse) XXX_DiscardUnknown() {
-	xxx_messageInfo_RunCommandResponse.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_RunCommandResponse proto.InternalMessageInfo
-
-func (m *RunCommandResponse) GetEffectiveCommand() string {
-	if m != nil {
-		return m.EffectiveCommand
-	}
-	return ""
-}
-
-func (m *RunCommandResponse) GetLines() []string {
-	if m != nil {
-		return m.Lines
-	}
-	return nil
-}
-
-func init() {
-	proto.RegisterType((*RunCommandRequest)(nil), "proto.RunCommandRequest")
-	proto.RegisterType((*RunCommandResponse)(nil), "proto.RunCommandResponse")
-}
-
-func init() { proto.RegisterFile("proxy.proto", fileDescriptor_700b50b08ed8dbaf) }
-
-var fileDescriptor_700b50b08ed8dbaf = []byte{
-	// 165 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x2e, 0x28, 0xca, 0xaf,
-	0xa8, 0xd4, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x05, 0x53, 0x4a, 0xba, 0x5c, 0x82, 0x41,
-	0xa5, 0x79, 0xce, 0xf9, 0xb9, 0xb9, 0x89, 0x79, 0x29, 0x41, 0xa9, 0x85, 0xa5, 0xa9, 0xc5, 0x25,
-	0x42, 0x12, 0x5c, 0xec, 0xc9, 0x10, 0x11, 0x09, 0x46, 0x05, 0x46, 0x0d, 0xce, 0x20, 0x18, 0x57,
-	0x29, 0x9c, 0x4b, 0x08, 0x59, 0x79, 0x71, 0x41, 0x7e, 0x5e, 0x71, 0xaa, 0x90, 0x36, 0x97, 0x60,
-	0x6a, 0x5a, 0x5a, 0x6a, 0x72, 0x49, 0x66, 0x59, 0x6a, 0x3c, 0xaa, 0x4e, 0x01, 0xb8, 0x04, 0x54,
-	0x93, 0x90, 0x08, 0x17, 0x6b, 0x4e, 0x66, 0x5e, 0x6a, 0xb1, 0x04, 0x93, 0x02, 0xb3, 0x06, 0x67,
-	0x10, 0x84, 0x63, 0xe4, 0xcf, 0xc5, 0xe5, 0x6b, 0x66, 0x64, 0x64, 0x10, 0x00, 0x72, 0xa2, 0x90,
-	0x23, 0x17, 0x17, 0xc2, 0x1a, 0x21, 0x09, 0x88, 0x93, 0xf5, 0x30, 0x1c, 0x2a, 0x25, 0x89, 0x45,
-	0x06, 0xe2, 0xa6, 0x24, 0x36, 0xb0, 0x8c, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0x39, 0x6d, 0xab,
-	0xdd, 0xf5, 0x00, 0x00, 0x00,
-}
-
-// Reference imports to suppress errors if they are not otherwise used.
-var _ context.Context
-var _ grpc.ClientConn
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the grpc package it is being compiled against.
-const _ = grpc.SupportPackageIsVersion4
-
-// M6220ProxyClient is the client API for M6220Proxy service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
-type M6220ProxyClient interface {
-	RunCommand(ctx context.Context, in *RunCommandRequest, opts ...grpc.CallOption) (*RunCommandResponse, error)
-}
-
-type m6220ProxyClient struct {
-	cc *grpc.ClientConn
-}
-
-func NewM6220ProxyClient(cc *grpc.ClientConn) M6220ProxyClient {
-	return &m6220ProxyClient{cc}
-}
-
-func (c *m6220ProxyClient) RunCommand(ctx context.Context, in *RunCommandRequest, opts ...grpc.CallOption) (*RunCommandResponse, error) {
-	out := new(RunCommandResponse)
-	err := c.cc.Invoke(ctx, "/proto.M6220Proxy/RunCommand", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-// M6220ProxyServer is the server API for M6220Proxy service.
-type M6220ProxyServer interface {
-	RunCommand(context.Context, *RunCommandRequest) (*RunCommandResponse, error)
-}
-
-func RegisterM6220ProxyServer(s *grpc.Server, srv M6220ProxyServer) {
-	s.RegisterService(&_M6220Proxy_serviceDesc, srv)
-}
-
-func _M6220Proxy_RunCommand_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(RunCommandRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(M6220ProxyServer).RunCommand(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/proto.M6220Proxy/RunCommand",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(M6220ProxyServer).RunCommand(ctx, req.(*RunCommandRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-var _M6220Proxy_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "proto.M6220Proxy",
-	HandlerType: (*M6220ProxyServer)(nil),
-	Methods: []grpc.MethodDesc{
-		{
-			MethodName: "RunCommand",
-			Handler:    _M6220Proxy_RunCommand_Handler,
-		},
-	},
-	Streams:  []grpc.StreamDesc{},
-	Metadata: "proxy.proto",
-}
diff --git a/go/svc/topo/proto/.gitignore b/go/svc/topo/proto/.gitignore
new file mode 100644
index 0000000..04204c7
--- /dev/null
+++ b/go/svc/topo/proto/.gitignore
@@ -0,0 +1 @@
+config
diff --git a/go/svc/topo/proto/config/config.pb.go b/go/svc/topo/proto/config/config.pb.go
deleted file mode 100644
index e5ef9a3..0000000
--- a/go/svc/topo/proto/config/config.pb.go
+++ /dev/null
@@ -1,365 +0,0 @@
-// Code generated by protoc-gen-go. DO NOT EDIT.
-// source: config.proto
-
-package config
-
-import (
-	fmt "fmt"
-	proto "github.com/golang/protobuf/proto"
-	math "math"
-)
-
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
-
-type Switch_Segment_Type int32
-
-const (
-	Switch_Segment_TYPE_INVALID Switch_Segment_Type = 0
-	Switch_Segment_TYPE_VLAN    Switch_Segment_Type = 1
-)
-
-var Switch_Segment_Type_name = map[int32]string{
-	0: "TYPE_INVALID",
-	1: "TYPE_VLAN",
-}
-
-var Switch_Segment_Type_value = map[string]int32{
-	"TYPE_INVALID": 0,
-	"TYPE_VLAN":    1,
-}
-
-func (x Switch_Segment_Type) String() string {
-	return proto.EnumName(Switch_Segment_Type_name, int32(x))
-}
-
-func (Switch_Segment_Type) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_3eaf2c85e69e9ea4, []int{1, 1, 0}
-}
-
-type Config struct {
-	Switch               []*Switch  `protobuf:"bytes,1,rep,name=switch,proto3" json:"switch,omitempty"`
-	Machine              []*Machine `protobuf:"bytes,2,rep,name=machine,proto3" json:"machine,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
-	XXX_unrecognized     []byte     `json:"-"`
-	XXX_sizecache        int32      `json:"-"`
-}
-
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
-func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_3eaf2c85e69e9ea4, []int{0}
-}
-
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
-}
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
-}
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
-}
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
-}
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Config proto.InternalMessageInfo
-
-func (m *Config) GetSwitch() []*Switch {
-	if m != nil {
-		return m.Switch
-	}
-	return nil
-}
-
-func (m *Config) GetMachine() []*Machine {
-	if m != nil {
-		return m.Machine
-	}
-	return nil
-}
-
-type Switch struct {
-	Name                 string               `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	ControlAddress       string               `protobuf:"bytes,2,opt,name=control_address,json=controlAddress,proto3" json:"control_address,omitempty"`
-	ManagedPort          []*Switch_SwitchPort `protobuf:"bytes,3,rep,name=managed_port,json=managedPort,proto3" json:"managed_port,omitempty"`
-	AvailableSegment     []*Switch_Segment    `protobuf:"bytes,4,rep,name=available_segment,json=availableSegment,proto3" json:"available_segment,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
-	XXX_unrecognized     []byte               `json:"-"`
-	XXX_sizecache        int32                `json:"-"`
-}
-
-func (m *Switch) Reset()         { *m = Switch{} }
-func (m *Switch) String() string { return proto.CompactTextString(m) }
-func (*Switch) ProtoMessage()    {}
-func (*Switch) Descriptor() ([]byte, []int) {
-	return fileDescriptor_3eaf2c85e69e9ea4, []int{1}
-}
-
-func (m *Switch) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Switch.Unmarshal(m, b)
-}
-func (m *Switch) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Switch.Marshal(b, m, deterministic)
-}
-func (m *Switch) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Switch.Merge(m, src)
-}
-func (m *Switch) XXX_Size() int {
-	return xxx_messageInfo_Switch.Size(m)
-}
-func (m *Switch) XXX_DiscardUnknown() {
-	xxx_messageInfo_Switch.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Switch proto.InternalMessageInfo
-
-func (m *Switch) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-func (m *Switch) GetControlAddress() string {
-	if m != nil {
-		return m.ControlAddress
-	}
-	return ""
-}
-
-func (m *Switch) GetManagedPort() []*Switch_SwitchPort {
-	if m != nil {
-		return m.ManagedPort
-	}
-	return nil
-}
-
-func (m *Switch) GetAvailableSegment() []*Switch_Segment {
-	if m != nil {
-		return m.AvailableSegment
-	}
-	return nil
-}
-
-type Switch_SwitchPort struct {
-	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *Switch_SwitchPort) Reset()         { *m = Switch_SwitchPort{} }
-func (m *Switch_SwitchPort) String() string { return proto.CompactTextString(m) }
-func (*Switch_SwitchPort) ProtoMessage()    {}
-func (*Switch_SwitchPort) Descriptor() ([]byte, []int) {
-	return fileDescriptor_3eaf2c85e69e9ea4, []int{1, 0}
-}
-
-func (m *Switch_SwitchPort) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Switch_SwitchPort.Unmarshal(m, b)
-}
-func (m *Switch_SwitchPort) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Switch_SwitchPort.Marshal(b, m, deterministic)
-}
-func (m *Switch_SwitchPort) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Switch_SwitchPort.Merge(m, src)
-}
-func (m *Switch_SwitchPort) XXX_Size() int {
-	return xxx_messageInfo_Switch_SwitchPort.Size(m)
-}
-func (m *Switch_SwitchPort) XXX_DiscardUnknown() {
-	xxx_messageInfo_Switch_SwitchPort.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Switch_SwitchPort proto.InternalMessageInfo
-
-func (m *Switch_SwitchPort) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-type Switch_Segment struct {
-	SegmentType          Switch_Segment_Type `protobuf:"varint,1,opt,name=segment_type,json=segmentType,proto3,enum=Switch_Segment_Type" json:"segment_type,omitempty"`
-	VlanId               int32               `protobuf:"varint,2,opt,name=vlan_id,json=vlanId,proto3" json:"vlan_id,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
-	XXX_unrecognized     []byte              `json:"-"`
-	XXX_sizecache        int32               `json:"-"`
-}
-
-func (m *Switch_Segment) Reset()         { *m = Switch_Segment{} }
-func (m *Switch_Segment) String() string { return proto.CompactTextString(m) }
-func (*Switch_Segment) ProtoMessage()    {}
-func (*Switch_Segment) Descriptor() ([]byte, []int) {
-	return fileDescriptor_3eaf2c85e69e9ea4, []int{1, 1}
-}
-
-func (m *Switch_Segment) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Switch_Segment.Unmarshal(m, b)
-}
-func (m *Switch_Segment) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Switch_Segment.Marshal(b, m, deterministic)
-}
-func (m *Switch_Segment) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Switch_Segment.Merge(m, src)
-}
-func (m *Switch_Segment) XXX_Size() int {
-	return xxx_messageInfo_Switch_Segment.Size(m)
-}
-func (m *Switch_Segment) XXX_DiscardUnknown() {
-	xxx_messageInfo_Switch_Segment.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Switch_Segment proto.InternalMessageInfo
-
-func (m *Switch_Segment) GetSegmentType() Switch_Segment_Type {
-	if m != nil {
-		return m.SegmentType
-	}
-	return Switch_Segment_TYPE_INVALID
-}
-
-func (m *Switch_Segment) GetVlanId() int32 {
-	if m != nil {
-		return m.VlanId
-	}
-	return 0
-}
-
-type Machine struct {
-	Name                 string          `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	ManagedPort          []*Machine_Port `protobuf:"bytes,2,rep,name=managed_port,json=managedPort,proto3" json:"managed_port,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
-	XXX_unrecognized     []byte          `json:"-"`
-	XXX_sizecache        int32           `json:"-"`
-}
-
-func (m *Machine) Reset()         { *m = Machine{} }
-func (m *Machine) String() string { return proto.CompactTextString(m) }
-func (*Machine) ProtoMessage()    {}
-func (*Machine) Descriptor() ([]byte, []int) {
-	return fileDescriptor_3eaf2c85e69e9ea4, []int{2}
-}
-
-func (m *Machine) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Machine.Unmarshal(m, b)
-}
-func (m *Machine) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Machine.Marshal(b, m, deterministic)
-}
-func (m *Machine) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Machine.Merge(m, src)
-}
-func (m *Machine) XXX_Size() int {
-	return xxx_messageInfo_Machine.Size(m)
-}
-func (m *Machine) XXX_DiscardUnknown() {
-	xxx_messageInfo_Machine.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Machine proto.InternalMessageInfo
-
-func (m *Machine) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-func (m *Machine) GetManagedPort() []*Machine_Port {
-	if m != nil {
-		return m.ManagedPort
-	}
-	return nil
-}
-
-type Machine_Port struct {
-	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *Machine_Port) Reset()         { *m = Machine_Port{} }
-func (m *Machine_Port) String() string { return proto.CompactTextString(m) }
-func (*Machine_Port) ProtoMessage()    {}
-func (*Machine_Port) Descriptor() ([]byte, []int) {
-	return fileDescriptor_3eaf2c85e69e9ea4, []int{2, 0}
-}
-
-func (m *Machine_Port) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Machine_Port.Unmarshal(m, b)
-}
-func (m *Machine_Port) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Machine_Port.Marshal(b, m, deterministic)
-}
-func (m *Machine_Port) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Machine_Port.Merge(m, src)
-}
-func (m *Machine_Port) XXX_Size() int {
-	return xxx_messageInfo_Machine_Port.Size(m)
-}
-func (m *Machine_Port) XXX_DiscardUnknown() {
-	xxx_messageInfo_Machine_Port.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Machine_Port proto.InternalMessageInfo
-
-func (m *Machine_Port) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-func init() {
-	proto.RegisterEnum("Switch_Segment_Type", Switch_Segment_Type_name, Switch_Segment_Type_value)
-	proto.RegisterType((*Config)(nil), "Config")
-	proto.RegisterType((*Switch)(nil), "Switch")
-	proto.RegisterType((*Switch_SwitchPort)(nil), "Switch.SwitchPort")
-	proto.RegisterType((*Switch_Segment)(nil), "Switch.Segment")
-	proto.RegisterType((*Machine)(nil), "Machine")
-	proto.RegisterType((*Machine_Port)(nil), "Machine.Port")
-}
-
-func init() { proto.RegisterFile("config.proto", fileDescriptor_3eaf2c85e69e9ea4) }
-
-var fileDescriptor_3eaf2c85e69e9ea4 = []byte{
-	// 335 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x52, 0x41, 0x4f, 0xc2, 0x30,
-	0x14, 0x76, 0x30, 0x37, 0x79, 0x0c, 0x98, 0x8d, 0x89, 0xcb, 0x2e, 0x92, 0x5d, 0xe0, 0xb4, 0x18,
-	0x8c, 0xf1, 0xe2, 0x85, 0xa8, 0x07, 0x12, 0x20, 0xa4, 0x12, 0x12, 0x4f, 0x4b, 0xd9, 0x2a, 0x2c,
-	0x6e, 0xed, 0xb2, 0x35, 0x18, 0xee, 0xfe, 0x53, 0xff, 0x88, 0xa1, 0x2d, 0x98, 0x20, 0x9e, 0xda,
-	0xef, 0x7b, 0xdf, 0xeb, 0x7b, 0xef, 0x7b, 0x05, 0x27, 0xe6, 0xec, 0x3d, 0x5d, 0x85, 0x45, 0xc9,
-	0x05, 0x0f, 0x26, 0x60, 0x3d, 0x49, 0x8c, 0x6e, 0xc0, 0xaa, 0x3e, 0x53, 0x11, 0xaf, 0x3d, 0xa3,
-	0x5b, 0xef, 0x37, 0x07, 0x76, 0xf8, 0x2a, 0x21, 0xd6, 0x34, 0x0a, 0xc0, 0xce, 0x49, 0xbc, 0x4e,
-	0x19, 0xf5, 0x6a, 0x52, 0x71, 0x11, 0x4e, 0x14, 0xc6, 0xfb, 0x40, 0xf0, 0x5d, 0x03, 0x4b, 0xa5,
-	0x21, 0x04, 0x26, 0x23, 0x39, 0xf5, 0x8c, 0xae, 0xd1, 0x6f, 0x60, 0x79, 0x47, 0x3d, 0xe8, 0xc4,
-	0x9c, 0x89, 0x92, 0x67, 0x11, 0x49, 0x92, 0x92, 0x56, 0x95, 0x57, 0x93, 0xe1, 0xb6, 0xa6, 0x87,
-	0x8a, 0x45, 0xf7, 0xe0, 0xe4, 0x84, 0x91, 0x15, 0x4d, 0xa2, 0x82, 0x97, 0xc2, 0xab, 0xcb, 0x82,
-	0x48, 0xb7, 0xa4, 0x8f, 0x19, 0x2f, 0x05, 0x6e, 0x6a, 0xdd, 0x0e, 0xa0, 0x47, 0xb8, 0x24, 0x1b,
-	0x92, 0x66, 0x64, 0x99, 0xd1, 0xa8, 0xa2, 0xab, 0x9c, 0x32, 0xe1, 0x99, 0x32, 0xb7, 0x73, 0xc8,
-	0x55, 0x34, 0x76, 0x0f, 0x4a, 0xcd, 0xf8, 0x5d, 0x80, 0xdf, 0x87, 0x4f, 0xf5, 0xef, 0x7f, 0x19,
-	0x60, 0x6b, 0x35, 0x7a, 0x00, 0x47, 0x57, 0x88, 0xc4, 0xb6, 0x50, 0xba, 0xf6, 0xe0, 0xea, 0xa8,
-	0x4c, 0x38, 0xdf, 0x16, 0x14, 0x37, 0xb5, 0x72, 0x07, 0xd0, 0x35, 0xd8, 0x9b, 0x8c, 0xb0, 0x28,
-	0x4d, 0xe4, 0xf0, 0xe7, 0xd8, 0xda, 0xc1, 0x51, 0x12, 0xf4, 0xc0, 0x94, 0x02, 0x17, 0x9c, 0xf9,
-	0xdb, 0xec, 0x25, 0x1a, 0x4d, 0x17, 0xc3, 0xf1, 0xe8, 0xd9, 0x3d, 0x43, 0x2d, 0x68, 0x48, 0x66,
-	0x31, 0x1e, 0x4e, 0x5d, 0x23, 0xf8, 0x00, 0x5b, 0x3b, 0x7f, 0xd2, 0xe5, 0xdb, 0x23, 0xf3, 0xd4,
-	0xb6, 0x5a, 0xfb, 0x6d, 0x85, 0x7f, 0x7c, 0xf3, 0x7d, 0x30, 0xff, 0x9b, 0x79, 0x69, 0xc9, 0x8f,
-	0x72, 0xf7, 0x13, 0x00, 0x00, 0xff, 0xff, 0x58, 0xe3, 0x1a, 0xb1, 0x38, 0x02, 0x00, 0x00,
-}
