diff --git a/doc/index.html b/doc/index.html
index ac60154a..1d5f23fb 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -1640,6 +1640,10 @@
Table of Contents
ESwitchOSVendor
+
+ ESwitchPortMembership
+
+
ESwitchPortStatus
@@ -14149,6 +14153,13 @@
BGPPortState represents the current BGP status of the port. |
+
+ | membership |
+ SwitchPortMembership |
+ |
+ Membership indicates whether the port is connected to an internal or external host. |
+
+
@@ -14489,6 +14500,42 @@
+
+ SwitchPortMembership indicates whether a switch port is connected to an internal or an external host.
+
+
+ | Name | Number | Description |
+
+
+
+
+ | SWITCH_PORT_MEMBERSHIP_UNSPECIFIED |
+ 0 |
+ SWITCH_PORT_MEMBERSHIP_UNSPECIFIED is not specified. |
+
+
+
+ | SWITCH_PORT_MEMBERSHIP_UNMANAGED |
+ 1 |
+ SWITCH_PORT_MEMBERSHIP_UNMANAGED is a port that isn't connected to any host yet. |
+
+
+
+ | SWITCH_PORT_MEMBERSHIP_INTERNAL |
+ 2 |
+ SWITCH_PORT_MEMBERSHIP_INTERNAL is port that is connected to a host that is registered at the api, e.g. a registered machine. |
+
+
+
+ | SWITCH_PORT_MEMBERSHIP_EXTERNAL |
+ 3 |
+ SWITCH_PORT_MEMBERSHIP_EXTERNAL is port that is connected to a host that is not registered at the api.
+This value allows connecting an external system to a network managed by us. |
+
+
+
+
+
SwitchPortStatus specifies the state of a switch port.
diff --git a/go/metalstack/api/v2/switch.pb.go b/go/metalstack/api/v2/switch.pb.go
index 50f2cde2..448afd8d 100644
--- a/go/metalstack/api/v2/switch.pb.go
+++ b/go/metalstack/api/v2/switch.pb.go
@@ -256,6 +256,64 @@ func (SwitchPortStatus) EnumDescriptor() ([]byte, []int) {
return file_metalstack_api_v2_switch_proto_rawDescGZIP(), []int{3}
}
+// SwitchPortMembership indicates whether a switch port is connected to an internal or an external host.
+type SwitchPortMembership int32
+
+const (
+ // SWITCH_PORT_MEMBERSHIP_UNSPECIFIED is not specified.
+ SwitchPortMembership_SWITCH_PORT_MEMBERSHIP_UNSPECIFIED SwitchPortMembership = 0
+ // SWITCH_PORT_MEMBERSHIP_UNMANAGED is a port that isn't connected to any host yet.
+ SwitchPortMembership_SWITCH_PORT_MEMBERSHIP_UNMANAGED SwitchPortMembership = 1
+ // SWITCH_PORT_MEMBERSHIP_INTERNAL is port that is connected to a host that is registered at the api, e.g. a registered machine.
+ SwitchPortMembership_SWITCH_PORT_MEMBERSHIP_INTERNAL SwitchPortMembership = 2
+ // SWITCH_PORT_MEMBERSHIP_EXTERNAL is port that is connected to a host that is not registered at the api.
+ // This value allows connecting an external system to a network managed by us.
+ SwitchPortMembership_SWITCH_PORT_MEMBERSHIP_EXTERNAL SwitchPortMembership = 3
+)
+
+// Enum value maps for SwitchPortMembership.
+var (
+ SwitchPortMembership_name = map[int32]string{
+ 0: "SWITCH_PORT_MEMBERSHIP_UNSPECIFIED",
+ 1: "SWITCH_PORT_MEMBERSHIP_UNMANAGED",
+ 2: "SWITCH_PORT_MEMBERSHIP_INTERNAL",
+ 3: "SWITCH_PORT_MEMBERSHIP_EXTERNAL",
+ }
+ SwitchPortMembership_value = map[string]int32{
+ "SWITCH_PORT_MEMBERSHIP_UNSPECIFIED": 0,
+ "SWITCH_PORT_MEMBERSHIP_UNMANAGED": 1,
+ "SWITCH_PORT_MEMBERSHIP_INTERNAL": 2,
+ "SWITCH_PORT_MEMBERSHIP_EXTERNAL": 3,
+ }
+)
+
+func (x SwitchPortMembership) Enum() *SwitchPortMembership {
+ p := new(SwitchPortMembership)
+ *p = x
+ return p
+}
+
+func (x SwitchPortMembership) String() string {
+ return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (SwitchPortMembership) Descriptor() protoreflect.EnumDescriptor {
+ return file_metalstack_api_v2_switch_proto_enumTypes[4].Descriptor()
+}
+
+func (SwitchPortMembership) Type() protoreflect.EnumType {
+ return &file_metalstack_api_v2_switch_proto_enumTypes[4]
+}
+
+func (x SwitchPortMembership) Number() protoreflect.EnumNumber {
+ return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use SwitchPortMembership.Descriptor instead.
+func (SwitchPortMembership) EnumDescriptor() ([]byte, []int) {
+ return file_metalstack_api_v2_switch_proto_rawDescGZIP(), []int{4}
+}
+
// Switch represents a network switch.
type Switch struct {
state protoimpl.MessageState `protogen:"open.v1"`
@@ -508,7 +566,9 @@ type SwitchNic struct {
// BGPFilter optionally configured on a port.
BgpFilter *BGPFilter `protobuf:"bytes,6,opt,name=bgp_filter,json=bgpFilter,proto3,oneof" json:"bgp_filter,omitempty"`
// BGPPortState represents the current BGP status of the port.
- BgpPortState *SwitchBGPPortState `protobuf:"bytes,7,opt,name=bgp_port_state,json=bgpPortState,proto3,oneof" json:"bgp_port_state,omitempty"`
+ BgpPortState *SwitchBGPPortState `protobuf:"bytes,7,opt,name=bgp_port_state,json=bgpPortState,proto3,oneof" json:"bgp_port_state,omitempty"`
+ // Membership indicates whether the port is connected to an internal or external host.
+ Membership SwitchPortMembership `protobuf:"varint,8,opt,name=membership,proto3,enum=metalstack.api.v2.SwitchPortMembership" json:"membership,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
@@ -592,6 +652,13 @@ func (x *SwitchNic) GetBgpPortState() *SwitchBGPPortState {
return nil
}
+func (x *SwitchNic) GetMembership() SwitchPortMembership {
+ if x != nil {
+ return x.Membership
+ }
+ return SwitchPortMembership_SWITCH_PORT_MEMBERSHIP_UNSPECIFIED
+}
+
// BGPFilter can be used to restrict BGP based on CIDRs and VNIs.
type BGPFilter struct {
state protoimpl.MessageState `protogen:"open.v1"`
@@ -1236,7 +1303,7 @@ const file_metalstack_api_v2_switch_proto_rawDesc = "" +
"\bSwitchOS\x12C\n" +
"\x06vendor\x18\x01 \x01(\x0e2!.metalstack.api.v2.SwitchOSVendorB\b\xbaH\x05\x82\x01\x02\x10\x01R\x06vendor\x12%\n" +
"\aversion\x18\x02 \x01(\tB\v\xbaH\br\x06\xc0\xb3\xae\xb1\x02\x01R\aversion\x129\n" +
- "\x12metal_core_version\x18\x03 \x01(\tB\v\xbaH\br\x06\xc0\xb3\xae\xb1\x02\x01R\x10metalCoreVersion\"\xa9\x03\n" +
+ "\x12metal_core_version\x18\x03 \x01(\tB\v\xbaH\br\x06\xc0\xb3\xae\xb1\x02\x01R\x10metalCoreVersion\"\xf2\x03\n" +
"\tSwitchNic\x12\x1f\n" +
"\x04name\x18\x01 \x01(\tB\v\xbaH\br\x06\xc0\xb3\xae\xb1\x02\x01R\x04name\x12+\n" +
"\n" +
@@ -1247,7 +1314,10 @@ const file_metalstack_api_v2_switch_proto_rawDesc = "" +
"\x05state\x18\x05 \x01(\v2\x1b.metalstack.api.v2.NicStateH\x02R\x05state\x88\x01\x01\x12@\n" +
"\n" +
"bgp_filter\x18\x06 \x01(\v2\x1c.metalstack.api.v2.BGPFilterH\x03R\tbgpFilter\x88\x01\x01\x12P\n" +
- "\x0ebgp_port_state\x18\a \x01(\v2%.metalstack.api.v2.SwitchBGPPortStateH\x04R\fbgpPortState\x88\x01\x01B\x06\n" +
+ "\x0ebgp_port_state\x18\a \x01(\v2%.metalstack.api.v2.SwitchBGPPortStateH\x04R\fbgpPortState\x88\x01\x01\x12G\n" +
+ "\n" +
+ "membership\x18\b \x01(\x0e2'.metalstack.api.v2.SwitchPortMembershipR\n" +
+ "membershipB\x06\n" +
"\x04_macB\x06\n" +
"\x04_vrfB\b\n" +
"\x06_stateB\r\n" +
@@ -1331,7 +1401,12 @@ const file_metalstack_api_v2_switch_proto_rawDesc = "" +
"\x1eSWITCH_PORT_STATUS_UNSPECIFIED\x10\x00\x12!\n" +
"\x15SWITCH_PORT_STATUS_UP\x10\x01\x1a\x06\x82\xb2\x19\x02up\x12%\n" +
"\x17SWITCH_PORT_STATUS_DOWN\x10\x02\x1a\b\x82\xb2\x19\x04down\x12+\n" +
- "\x1aSWITCH_PORT_STATUS_UNKNOWN\x10\x03\x1a\v\x82\xb2\x19\aunknownB\xc1\x01\n" +
+ "\x1aSWITCH_PORT_STATUS_UNKNOWN\x10\x03\x1a\v\x82\xb2\x19\aunknown*\xd9\x01\n" +
+ "\x14SwitchPortMembership\x12&\n" +
+ "\"SWITCH_PORT_MEMBERSHIP_UNSPECIFIED\x10\x00\x123\n" +
+ " SWITCH_PORT_MEMBERSHIP_UNMANAGED\x10\x01\x1a\r\x82\xb2\x19\tunmanaged\x121\n" +
+ "\x1fSWITCH_PORT_MEMBERSHIP_INTERNAL\x10\x02\x1a\f\x82\xb2\x19\binternal\x121\n" +
+ "\x1fSWITCH_PORT_MEMBERSHIP_EXTERNAL\x10\x03\x1a\f\x82\xb2\x19\bexternalB\xc1\x01\n" +
"\x15com.metalstack.api.v2B\vSwitchProtoP\x01Z5github.com/metal-stack/api/go/metalstack/api/v2;apiv2\xa2\x02\x03MAX\xaa\x02\x11Metalstack.Api.V2\xca\x02\x11Metalstack\\Api\\V2\xe2\x02\x1dMetalstack\\Api\\V2\\GPBMetadata\xea\x02\x13Metalstack::Api::V2b\x06proto3"
var (
@@ -1346,61 +1421,63 @@ func file_metalstack_api_v2_switch_proto_rawDescGZIP() []byte {
return file_metalstack_api_v2_switch_proto_rawDescData
}
-var file_metalstack_api_v2_switch_proto_enumTypes = make([]protoimpl.EnumInfo, 4)
+var file_metalstack_api_v2_switch_proto_enumTypes = make([]protoimpl.EnumInfo, 5)
var file_metalstack_api_v2_switch_proto_msgTypes = make([]protoimpl.MessageInfo, 12)
var file_metalstack_api_v2_switch_proto_goTypes = []any{
(BGPState)(0), // 0: metalstack.api.v2.BGPState
(SwitchReplaceMode)(0), // 1: metalstack.api.v2.SwitchReplaceMode
(SwitchOSVendor)(0), // 2: metalstack.api.v2.SwitchOSVendor
(SwitchPortStatus)(0), // 3: metalstack.api.v2.SwitchPortStatus
- (*Switch)(nil), // 4: metalstack.api.v2.Switch
- (*SwitchOS)(nil), // 5: metalstack.api.v2.SwitchOS
- (*SwitchNic)(nil), // 6: metalstack.api.v2.SwitchNic
- (*BGPFilter)(nil), // 7: metalstack.api.v2.BGPFilter
- (*SwitchBGPPortState)(nil), // 8: metalstack.api.v2.SwitchBGPPortState
- (*NicState)(nil), // 9: metalstack.api.v2.NicState
- (*MachineConnection)(nil), // 10: metalstack.api.v2.MachineConnection
- (*SwitchQuery)(nil), // 11: metalstack.api.v2.SwitchQuery
- (*SwitchOSQuery)(nil), // 12: metalstack.api.v2.SwitchOSQuery
- (*SwitchSync)(nil), // 13: metalstack.api.v2.SwitchSync
- (*SwitchWithMachines)(nil), // 14: metalstack.api.v2.SwitchWithMachines
- (*SwitchNicWithMachine)(nil), // 15: metalstack.api.v2.SwitchNicWithMachine
- (*Meta)(nil), // 16: metalstack.api.v2.Meta
- (*timestamppb.Timestamp)(nil), // 17: google.protobuf.Timestamp
- (*durationpb.Duration)(nil), // 18: google.protobuf.Duration
- (*Machine)(nil), // 19: metalstack.api.v2.Machine
- (*MachineFRU)(nil), // 20: metalstack.api.v2.MachineFRU
+ (SwitchPortMembership)(0), // 4: metalstack.api.v2.SwitchPortMembership
+ (*Switch)(nil), // 5: metalstack.api.v2.Switch
+ (*SwitchOS)(nil), // 6: metalstack.api.v2.SwitchOS
+ (*SwitchNic)(nil), // 7: metalstack.api.v2.SwitchNic
+ (*BGPFilter)(nil), // 8: metalstack.api.v2.BGPFilter
+ (*SwitchBGPPortState)(nil), // 9: metalstack.api.v2.SwitchBGPPortState
+ (*NicState)(nil), // 10: metalstack.api.v2.NicState
+ (*MachineConnection)(nil), // 11: metalstack.api.v2.MachineConnection
+ (*SwitchQuery)(nil), // 12: metalstack.api.v2.SwitchQuery
+ (*SwitchOSQuery)(nil), // 13: metalstack.api.v2.SwitchOSQuery
+ (*SwitchSync)(nil), // 14: metalstack.api.v2.SwitchSync
+ (*SwitchWithMachines)(nil), // 15: metalstack.api.v2.SwitchWithMachines
+ (*SwitchNicWithMachine)(nil), // 16: metalstack.api.v2.SwitchNicWithMachine
+ (*Meta)(nil), // 17: metalstack.api.v2.Meta
+ (*timestamppb.Timestamp)(nil), // 18: google.protobuf.Timestamp
+ (*durationpb.Duration)(nil), // 19: google.protobuf.Duration
+ (*Machine)(nil), // 20: metalstack.api.v2.Machine
+ (*MachineFRU)(nil), // 21: metalstack.api.v2.MachineFRU
}
var file_metalstack_api_v2_switch_proto_depIdxs = []int32{
- 16, // 0: metalstack.api.v2.Switch.meta:type_name -> metalstack.api.v2.Meta
+ 17, // 0: metalstack.api.v2.Switch.meta:type_name -> metalstack.api.v2.Meta
1, // 1: metalstack.api.v2.Switch.replace_mode:type_name -> metalstack.api.v2.SwitchReplaceMode
- 6, // 2: metalstack.api.v2.Switch.nics:type_name -> metalstack.api.v2.SwitchNic
- 5, // 3: metalstack.api.v2.Switch.os:type_name -> metalstack.api.v2.SwitchOS
- 10, // 4: metalstack.api.v2.Switch.machine_connections:type_name -> metalstack.api.v2.MachineConnection
- 13, // 5: metalstack.api.v2.Switch.last_sync:type_name -> metalstack.api.v2.SwitchSync
- 13, // 6: metalstack.api.v2.Switch.last_sync_error:type_name -> metalstack.api.v2.SwitchSync
+ 7, // 2: metalstack.api.v2.Switch.nics:type_name -> metalstack.api.v2.SwitchNic
+ 6, // 3: metalstack.api.v2.Switch.os:type_name -> metalstack.api.v2.SwitchOS
+ 11, // 4: metalstack.api.v2.Switch.machine_connections:type_name -> metalstack.api.v2.MachineConnection
+ 14, // 5: metalstack.api.v2.Switch.last_sync:type_name -> metalstack.api.v2.SwitchSync
+ 14, // 6: metalstack.api.v2.Switch.last_sync_error:type_name -> metalstack.api.v2.SwitchSync
2, // 7: metalstack.api.v2.SwitchOS.vendor:type_name -> metalstack.api.v2.SwitchOSVendor
- 9, // 8: metalstack.api.v2.SwitchNic.state:type_name -> metalstack.api.v2.NicState
- 7, // 9: metalstack.api.v2.SwitchNic.bgp_filter:type_name -> metalstack.api.v2.BGPFilter
- 8, // 10: metalstack.api.v2.SwitchNic.bgp_port_state:type_name -> metalstack.api.v2.SwitchBGPPortState
- 0, // 11: metalstack.api.v2.SwitchBGPPortState.bgp_state:type_name -> metalstack.api.v2.BGPState
- 17, // 12: metalstack.api.v2.SwitchBGPPortState.bgp_timer_up_established:type_name -> google.protobuf.Timestamp
- 3, // 13: metalstack.api.v2.NicState.desired:type_name -> metalstack.api.v2.SwitchPortStatus
- 3, // 14: metalstack.api.v2.NicState.actual:type_name -> metalstack.api.v2.SwitchPortStatus
- 6, // 15: metalstack.api.v2.MachineConnection.nic:type_name -> metalstack.api.v2.SwitchNic
- 12, // 16: metalstack.api.v2.SwitchQuery.os:type_name -> metalstack.api.v2.SwitchOSQuery
- 2, // 17: metalstack.api.v2.SwitchOSQuery.vendor:type_name -> metalstack.api.v2.SwitchOSVendor
- 17, // 18: metalstack.api.v2.SwitchSync.time:type_name -> google.protobuf.Timestamp
- 18, // 19: metalstack.api.v2.SwitchSync.duration:type_name -> google.protobuf.Duration
- 15, // 20: metalstack.api.v2.SwitchWithMachines.connections:type_name -> metalstack.api.v2.SwitchNicWithMachine
- 6, // 21: metalstack.api.v2.SwitchNicWithMachine.nic:type_name -> metalstack.api.v2.SwitchNic
- 19, // 22: metalstack.api.v2.SwitchNicWithMachine.machine:type_name -> metalstack.api.v2.Machine
- 20, // 23: metalstack.api.v2.SwitchNicWithMachine.fru:type_name -> metalstack.api.v2.MachineFRU
- 24, // [24:24] is the sub-list for method output_type
- 24, // [24:24] is the sub-list for method input_type
- 24, // [24:24] is the sub-list for extension type_name
- 24, // [24:24] is the sub-list for extension extendee
- 0, // [0:24] is the sub-list for field type_name
+ 10, // 8: metalstack.api.v2.SwitchNic.state:type_name -> metalstack.api.v2.NicState
+ 8, // 9: metalstack.api.v2.SwitchNic.bgp_filter:type_name -> metalstack.api.v2.BGPFilter
+ 9, // 10: metalstack.api.v2.SwitchNic.bgp_port_state:type_name -> metalstack.api.v2.SwitchBGPPortState
+ 4, // 11: metalstack.api.v2.SwitchNic.membership:type_name -> metalstack.api.v2.SwitchPortMembership
+ 0, // 12: metalstack.api.v2.SwitchBGPPortState.bgp_state:type_name -> metalstack.api.v2.BGPState
+ 18, // 13: metalstack.api.v2.SwitchBGPPortState.bgp_timer_up_established:type_name -> google.protobuf.Timestamp
+ 3, // 14: metalstack.api.v2.NicState.desired:type_name -> metalstack.api.v2.SwitchPortStatus
+ 3, // 15: metalstack.api.v2.NicState.actual:type_name -> metalstack.api.v2.SwitchPortStatus
+ 7, // 16: metalstack.api.v2.MachineConnection.nic:type_name -> metalstack.api.v2.SwitchNic
+ 13, // 17: metalstack.api.v2.SwitchQuery.os:type_name -> metalstack.api.v2.SwitchOSQuery
+ 2, // 18: metalstack.api.v2.SwitchOSQuery.vendor:type_name -> metalstack.api.v2.SwitchOSVendor
+ 18, // 19: metalstack.api.v2.SwitchSync.time:type_name -> google.protobuf.Timestamp
+ 19, // 20: metalstack.api.v2.SwitchSync.duration:type_name -> google.protobuf.Duration
+ 16, // 21: metalstack.api.v2.SwitchWithMachines.connections:type_name -> metalstack.api.v2.SwitchNicWithMachine
+ 7, // 22: metalstack.api.v2.SwitchNicWithMachine.nic:type_name -> metalstack.api.v2.SwitchNic
+ 20, // 23: metalstack.api.v2.SwitchNicWithMachine.machine:type_name -> metalstack.api.v2.Machine
+ 21, // 24: metalstack.api.v2.SwitchNicWithMachine.fru:type_name -> metalstack.api.v2.MachineFRU
+ 25, // [25:25] is the sub-list for method output_type
+ 25, // [25:25] is the sub-list for method input_type
+ 25, // [25:25] is the sub-list for extension type_name
+ 25, // [25:25] is the sub-list for extension extendee
+ 0, // [0:25] is the sub-list for field type_name
}
func init() { file_metalstack_api_v2_switch_proto_init() }
@@ -1422,7 +1499,7 @@ func file_metalstack_api_v2_switch_proto_init() {
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: unsafe.Slice(unsafe.StringData(file_metalstack_api_v2_switch_proto_rawDesc), len(file_metalstack_api_v2_switch_proto_rawDesc)),
- NumEnums: 4,
+ NumEnums: 5,
NumMessages: 12,
NumExtensions: 0,
NumServices: 0,
diff --git a/js/metalstack/api/v2/switch_pb.d.ts b/js/metalstack/api/v2/switch_pb.d.ts
index 64b9e049..93da33fd 100644
--- a/js/metalstack/api/v2/switch_pb.d.ts
+++ b/js/metalstack/api/v2/switch_pb.d.ts
@@ -187,6 +187,12 @@ export type SwitchNic = Message<"metalstack.api.v2.SwitchNic"> & {
* @generated from field: optional metalstack.api.v2.SwitchBGPPortState bgp_port_state = 7;
*/
bgpPortState?: SwitchBGPPortState | undefined;
+ /**
+ * Membership indicates whether the port is connected to an internal or external host.
+ *
+ * @generated from field: metalstack.api.v2.SwitchPortMembership membership = 8;
+ */
+ membership: SwitchPortMembership;
};
/**
* Describes the message metalstack.api.v2.SwitchNic.
@@ -633,3 +639,39 @@ export declare enum SwitchPortStatus {
* Describes the enum metalstack.api.v2.SwitchPortStatus.
*/
export declare const SwitchPortStatusSchema: GenEnum;
+/**
+ * SwitchPortMembership indicates whether a switch port is connected to an internal or an external host.
+ *
+ * @generated from enum metalstack.api.v2.SwitchPortMembership
+ */
+export declare enum SwitchPortMembership {
+ /**
+ * SWITCH_PORT_MEMBERSHIP_UNSPECIFIED is not specified.
+ *
+ * @generated from enum value: SWITCH_PORT_MEMBERSHIP_UNSPECIFIED = 0;
+ */
+ UNSPECIFIED = 0,
+ /**
+ * SWITCH_PORT_MEMBERSHIP_UNMANAGED is a port that isn't connected to any host yet.
+ *
+ * @generated from enum value: SWITCH_PORT_MEMBERSHIP_UNMANAGED = 1;
+ */
+ UNMANAGED = 1,
+ /**
+ * SWITCH_PORT_MEMBERSHIP_INTERNAL is port that is connected to a host that is registered at the api, e.g. a registered machine.
+ *
+ * @generated from enum value: SWITCH_PORT_MEMBERSHIP_INTERNAL = 2;
+ */
+ INTERNAL = 2,
+ /**
+ * SWITCH_PORT_MEMBERSHIP_EXTERNAL is port that is connected to a host that is not registered at the api.
+ * This value allows connecting an external system to a network managed by us.
+ *
+ * @generated from enum value: SWITCH_PORT_MEMBERSHIP_EXTERNAL = 3;
+ */
+ EXTERNAL = 3
+}
+/**
+ * Describes the enum metalstack.api.v2.SwitchPortMembership.
+ */
+export declare const SwitchPortMembershipSchema: GenEnum;
diff --git a/js/metalstack/api/v2/switch_pb.js b/js/metalstack/api/v2/switch_pb.js
index ae76fb8c..ee6ad5e6 100644
--- a/js/metalstack/api/v2/switch_pb.js
+++ b/js/metalstack/api/v2/switch_pb.js
@@ -10,7 +10,7 @@ import { file_metalstack_api_v2_predefined_rules } from "./predefined_rules_pb";
/**
* Describes the file metalstack/api/v2/switch.proto.
*/
-export const file_metalstack_api_v2_switch = /*@__PURE__*/ fileDesc("Ch5tZXRhbHN0YWNrL2FwaS92Mi9zd2l0Y2gucHJvdG8SEW1ldGFsc3RhY2suYXBpLnYyIsIFCgZTd2l0Y2gSGQoCaWQYASABKAlCDbpICnIIwLOusQIBaAESJQoEbWV0YRgCIAEoCzIXLm1ldGFsc3RhY2suYXBpLnYyLk1ldGESIAoLZGVzY3JpcHRpb24YAyABKAlCC7pICHIGyLOusQIBEh4KBHJhY2sYBCABKAlCC7pICHIGwLOusQIBSACIAQESHgoEcm9vbRgFIAEoCUILukgIcgbAs66xAgFIAYgBARIeCglwYXJ0aXRpb24YBiABKAlCC7pICHIG0LOusQIBEkQKDHJlcGxhY2VfbW9kZRgHIAEoDjIkLm1ldGFsc3RhY2suYXBpLnYyLlN3aXRjaFJlcGxhY2VNb2RlQgi6SAWCAQIQARIeCg1tYW5hZ2VtZW50X2lwGAggASgJQge6SARyAnABEigKD21hbmFnZW1lbnRfdXNlchgJIAEoCUIKukgHcgUQAhiAAUgCiAEBEigKD2NvbnNvbGVfY29tbWFuZBgKIAEoCUIKukgHcgUQAhiAAUgDiAEBEioKBG5pY3MYCyADKAsyHC5tZXRhbHN0YWNrLmFwaS52Mi5Td2l0Y2hOaWMSJwoCb3MYDCABKAsyGy5tZXRhbHN0YWNrLmFwaS52Mi5Td2l0Y2hPUxJBChNtYWNoaW5lX2Nvbm5lY3Rpb25zGA0gAygLMiQubWV0YWxzdGFjay5hcGkudjIuTWFjaGluZUNvbm5lY3Rpb24SMAoJbGFzdF9zeW5jGA4gASgLMh0ubWV0YWxzdGFjay5hcGkudjIuU3dpdGNoU3luYxI2Cg9sYXN0X3N5bmNfZXJyb3IYDyABKAsyHS5tZXRhbHN0YWNrLmFwaS52Mi5Td2l0Y2hTeW5jQgcKBV9yYWNrQgcKBV9yb29tQhIKEF9tYW5hZ2VtZW50X3VzZXJCEgoQX2NvbnNvbGVfY29tbWFuZCKOAQoIU3dpdGNoT1MSOwoGdmVuZG9yGAEgASgOMiEubWV0YWxzdGFjay5hcGkudjIuU3dpdGNoT1NWZW5kb3JCCLpIBYIBAhABEhwKB3ZlcnNpb24YAiABKAlCC7pICHIGwLOusQIBEicKEm1ldGFsX2NvcmVfdmVyc2lvbhgDIAEoCUILukgIcgbAs66xAgEi7QIKCVN3aXRjaE5pYxIZCgRuYW1lGAEgASgJQgu6SAhyBsCzrrECARIfCgppZGVudGlmaWVyGAIgASgJQgu6SAhyBsCzrrECARIdCgNtYWMYAyABKAlCC7pICHIGuLOusQIBSACIAQESHQoDdnJmGAQgASgJQgu6SAhyBsCzrrECAUgBiAEBEi8KBXN0YXRlGAUgASgLMhsubWV0YWxzdGFjay5hcGkudjIuTmljU3RhdGVIAogBARI1CgpiZ3BfZmlsdGVyGAYgASgLMhwubWV0YWxzdGFjay5hcGkudjIuQkdQRmlsdGVySAOIAQESQgoOYmdwX3BvcnRfc3RhdGUYByABKAsyJS5tZXRhbHN0YWNrLmFwaS52Mi5Td2l0Y2hCR1BQb3J0U3RhdGVIBIgBAUIGCgRfbWFjQgYKBF92cmZCCAoGX3N0YXRlQg0KC19iZ3BfZmlsdGVyQhEKD19iZ3BfcG9ydF9zdGF0ZSJHCglCR1BGaWx0ZXISGwoFY2lkcnMYASADKAlCDLpICZIBBriks7ECARIdCgR2bmlzGAIgAygJQg+6SAySAQkiB3IFEAIYgAEiqQIKElN3aXRjaEJHUFBvcnRTdGF0ZRIdCghuZWlnaGJvchgBIAEoCUILukgIcgbAs66xAgESHwoKcGVlcl9ncm91cBgCIAEoCUILukgIcgbAs66xAgESHQoIdnJmX25hbWUYAyABKAlCC7pICHIGwLOusQIBEjgKCWJncF9zdGF0ZRgEIAEoDjIbLm1ldGFsc3RhY2suYXBpLnYyLkJHUFN0YXRlQgi6SAWCAQIQARI8ChhiZ3BfdGltZXJfdXBfZXN0YWJsaXNoZWQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhsKE3NlbnRfcHJlZml4X2NvdW50ZXIYBiABKAQSHwoXYWNjZXB0ZWRfcHJlZml4X2NvdW50ZXIYByABKAQimgEKCE5pY1N0YXRlEkMKB2Rlc2lyZWQYASABKA4yIy5tZXRhbHN0YWNrLmFwaS52Mi5Td2l0Y2hQb3J0U3RhdHVzQgi6SAWCAQIQAUgAiAEBEj0KBmFjdHVhbBgCIAEoDjIjLm1ldGFsc3RhY2suYXBpLnYyLlN3aXRjaFBvcnRTdGF0dXNCCLpIBYIBAhABQgoKCF9kZXNpcmVkIlIKEU1hY2hpbmVDb25uZWN0aW9uEhIKCm1hY2hpbmVfaWQYASABKAkSKQoDbmljGAIgASgLMhwubWV0YWxzdGFjay5hcGkudjIuU3dpdGNoTmljIrkCCgtTd2l0Y2hRdWVyeRIeCgJpZBgBIAEoCUINukgKcgjAs66xAgFoAUgAiAEBEiMKCXBhcnRpdGlvbhgCIAEoCUILukgIcgbQs66xAgFIAYgBARIeCgRyYWNrGAMgASgJQgu6SAhyBsCzrrECAUgCiAEBEh4KBHJvb20YBCABKAlCC7pICHIGwLOusQIBSAOIAQESMQoCb3MYBSABKAsyIC5tZXRhbHN0YWNrLmFwaS52Mi5Td2l0Y2hPU1F1ZXJ5SASIAQESKwoUY29ubmVjdGVkX21hY2hpbmVfaWQYBiABKAlCCLpIBXIDsAEBSAWIAQFCBQoDX2lkQgwKCl9wYXJ0aXRpb25CBwoFX3JhY2tCBwoFX3Jvb21CBQoDX29zQhcKFV9jb25uZWN0ZWRfbWFjaGluZV9pZCKLAQoNU3dpdGNoT1NRdWVyeRJACgZ2ZW5kb3IYASABKA4yIS5tZXRhbHN0YWNrLmFwaS52Mi5Td2l0Y2hPU1ZlbmRvckIIukgFggECEAFIAIgBARIhCgd2ZXJzaW9uGAIgASgJQgu6SAhyBsCzrrECAUgBiAEBQgkKB192ZW5kb3JCCgoIX3ZlcnNpb24igQEKClN3aXRjaFN5bmMSKAoEdGltZRgBIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASKwoIZHVyYXRpb24YAiABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb24SEgoFZXJyb3IYAyABKAlIAIgBAUIICgZfZXJyb3IifwoSU3dpdGNoV2l0aE1hY2hpbmVzEgoKAmlkGAEgASgJEhEKCXBhcnRpdGlvbhgCIAEoCRIMCgRyYWNrGAMgASgJEjwKC2Nvbm5lY3Rpb25zGAQgAygLMicubWV0YWxzdGFjay5hcGkudjIuU3dpdGNoTmljV2l0aE1hY2hpbmUimgEKFFN3aXRjaE5pY1dpdGhNYWNoaW5lEikKA25pYxgBIAEoCzIcLm1ldGFsc3RhY2suYXBpLnYyLlN3aXRjaE5pYxIrCgdtYWNoaW5lGAIgASgLMhoubWV0YWxzdGFjay5hcGkudjIuTWFjaGluZRIqCgNmcnUYAyABKAsyHS5tZXRhbHN0YWNrLmFwaS52Mi5NYWNoaW5lRlJVKokCCghCR1BTdGF0ZRIZChVCR1BfU1RBVEVfVU5TUEVDSUZJRUQQABIcCg5CR1BfU1RBVEVfSURMRRABGgiCshkESWRsZRIiChFCR1BfU1RBVEVfQ09OTkVDVBACGguCshkHQ29ubmVjdBIgChBCR1BfU1RBVEVfQUNUSVZFEAMaCoKyGQZBY3RpdmUSJQoTQkdQX1NUQVRFX09QRU5fU0VOVBAEGgyCshkIT3BlblNlbnQSKwoWQkdQX1NUQVRFX09QRU5fQ09ORklSTRAFGg+CshkLT3BlbkNvbmZpcm0SKgoVQkdQX1NUQVRFX0VTVEFCTElTSEVEEAYaD4KyGQtFc3RhYmxpc2hlZCqiAQoRU3dpdGNoUmVwbGFjZU1vZGUSKQofU1dJVENIX1JFUExBQ0VfTU9ERV9VTlNQRUNJRklFRBAAGgSCshkAEiwKG1NXSVRDSF9SRVBMQUNFX01PREVfUkVQTEFDRRABGguCshkHcmVwbGFjZRI0Ch9TV0lUQ0hfUkVQTEFDRV9NT0RFX09QRVJBVElPTkFMEAIaD4KyGQtvcGVyYXRpb25hbCqEAQoOU3dpdGNoT1NWZW5kb3ISIAocU1dJVENIX09TX1ZFTkRPUl9VTlNQRUNJRklFRBAAEikKGFNXSVRDSF9PU19WRU5ET1JfQ1VNVUxVUxABGguCshkHQ3VtdWx1cxIlChZTV0lUQ0hfT1NfVkVORE9SX1NPTklDEAIaCYKyGQVTT05pQyqtAQoQU3dpdGNoUG9ydFN0YXR1cxIiCh5TV0lUQ0hfUE9SVF9TVEFUVVNfVU5TUEVDSUZJRUQQABIhChVTV0lUQ0hfUE9SVF9TVEFUVVNfVVAQARoGgrIZAnVwEiUKF1NXSVRDSF9QT1JUX1NUQVRVU19ET1dOEAIaCIKyGQRkb3duEisKGlNXSVRDSF9QT1JUX1NUQVRVU19VTktOT1dOEAMaC4KyGQd1bmtub3duQsEBChVjb20ubWV0YWxzdGFjay5hcGkudjJCC1N3aXRjaFByb3RvUAFaNWdpdGh1Yi5jb20vbWV0YWwtc3RhY2svYXBpL2dvL21ldGFsc3RhY2svYXBpL3YyO2FwaXYyogIDTUFYqgIRTWV0YWxzdGFjay5BcGkuVjLKAhFNZXRhbHN0YWNrXEFwaVxWMuICHU1ldGFsc3RhY2tcQXBpXFYyXEdQQk1ldGFkYXRh6gITTWV0YWxzdGFjazo6QXBpOjpWMmIGcHJvdG8z", [file_buf_validate_validate, file_google_protobuf_duration, file_google_protobuf_timestamp, file_metalstack_api_v2_common, file_metalstack_api_v2_machine, file_metalstack_api_v2_predefined_rules]);
+export const file_metalstack_api_v2_switch = /*@__PURE__*/ fileDesc("Ch5tZXRhbHN0YWNrL2FwaS92Mi9zd2l0Y2gucHJvdG8SEW1ldGFsc3RhY2suYXBpLnYyIsIFCgZTd2l0Y2gSGQoCaWQYASABKAlCDbpICnIIwLOusQIBaAESJQoEbWV0YRgCIAEoCzIXLm1ldGFsc3RhY2suYXBpLnYyLk1ldGESIAoLZGVzY3JpcHRpb24YAyABKAlCC7pICHIGyLOusQIBEh4KBHJhY2sYBCABKAlCC7pICHIGwLOusQIBSACIAQESHgoEcm9vbRgFIAEoCUILukgIcgbAs66xAgFIAYgBARIeCglwYXJ0aXRpb24YBiABKAlCC7pICHIG0LOusQIBEkQKDHJlcGxhY2VfbW9kZRgHIAEoDjIkLm1ldGFsc3RhY2suYXBpLnYyLlN3aXRjaFJlcGxhY2VNb2RlQgi6SAWCAQIQARIeCg1tYW5hZ2VtZW50X2lwGAggASgJQge6SARyAnABEigKD21hbmFnZW1lbnRfdXNlchgJIAEoCUIKukgHcgUQAhiAAUgCiAEBEigKD2NvbnNvbGVfY29tbWFuZBgKIAEoCUIKukgHcgUQAhiAAUgDiAEBEioKBG5pY3MYCyADKAsyHC5tZXRhbHN0YWNrLmFwaS52Mi5Td2l0Y2hOaWMSJwoCb3MYDCABKAsyGy5tZXRhbHN0YWNrLmFwaS52Mi5Td2l0Y2hPUxJBChNtYWNoaW5lX2Nvbm5lY3Rpb25zGA0gAygLMiQubWV0YWxzdGFjay5hcGkudjIuTWFjaGluZUNvbm5lY3Rpb24SMAoJbGFzdF9zeW5jGA4gASgLMh0ubWV0YWxzdGFjay5hcGkudjIuU3dpdGNoU3luYxI2Cg9sYXN0X3N5bmNfZXJyb3IYDyABKAsyHS5tZXRhbHN0YWNrLmFwaS52Mi5Td2l0Y2hTeW5jQgcKBV9yYWNrQgcKBV9yb29tQhIKEF9tYW5hZ2VtZW50X3VzZXJCEgoQX2NvbnNvbGVfY29tbWFuZCKOAQoIU3dpdGNoT1MSOwoGdmVuZG9yGAEgASgOMiEubWV0YWxzdGFjay5hcGkudjIuU3dpdGNoT1NWZW5kb3JCCLpIBYIBAhABEhwKB3ZlcnNpb24YAiABKAlCC7pICHIGwLOusQIBEicKEm1ldGFsX2NvcmVfdmVyc2lvbhgDIAEoCUILukgIcgbAs66xAgEiqgMKCVN3aXRjaE5pYxIZCgRuYW1lGAEgASgJQgu6SAhyBsCzrrECARIfCgppZGVudGlmaWVyGAIgASgJQgu6SAhyBsCzrrECARIdCgNtYWMYAyABKAlCC7pICHIGuLOusQIBSACIAQESHQoDdnJmGAQgASgJQgu6SAhyBsCzrrECAUgBiAEBEi8KBXN0YXRlGAUgASgLMhsubWV0YWxzdGFjay5hcGkudjIuTmljU3RhdGVIAogBARI1CgpiZ3BfZmlsdGVyGAYgASgLMhwubWV0YWxzdGFjay5hcGkudjIuQkdQRmlsdGVySAOIAQESQgoOYmdwX3BvcnRfc3RhdGUYByABKAsyJS5tZXRhbHN0YWNrLmFwaS52Mi5Td2l0Y2hCR1BQb3J0U3RhdGVIBIgBARI7CgptZW1iZXJzaGlwGAggASgOMicubWV0YWxzdGFjay5hcGkudjIuU3dpdGNoUG9ydE1lbWJlcnNoaXBCBgoEX21hY0IGCgRfdnJmQggKBl9zdGF0ZUINCgtfYmdwX2ZpbHRlckIRCg9fYmdwX3BvcnRfc3RhdGUiRwoJQkdQRmlsdGVyEhsKBWNpZHJzGAEgAygJQgy6SAmSAQa4pLOxAgESHQoEdm5pcxgCIAMoCUIPukgMkgEJIgdyBRACGIABIqkCChJTd2l0Y2hCR1BQb3J0U3RhdGUSHQoIbmVpZ2hib3IYASABKAlCC7pICHIGwLOusQIBEh8KCnBlZXJfZ3JvdXAYAiABKAlCC7pICHIGwLOusQIBEh0KCHZyZl9uYW1lGAMgASgJQgu6SAhyBsCzrrECARI4CgliZ3Bfc3RhdGUYBCABKA4yGy5tZXRhbHN0YWNrLmFwaS52Mi5CR1BTdGF0ZUIIukgFggECEAESPAoYYmdwX3RpbWVyX3VwX2VzdGFibGlzaGVkGAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIbChNzZW50X3ByZWZpeF9jb3VudGVyGAYgASgEEh8KF2FjY2VwdGVkX3ByZWZpeF9jb3VudGVyGAcgASgEIpoBCghOaWNTdGF0ZRJDCgdkZXNpcmVkGAEgASgOMiMubWV0YWxzdGFjay5hcGkudjIuU3dpdGNoUG9ydFN0YXR1c0IIukgFggECEAFIAIgBARI9CgZhY3R1YWwYAiABKA4yIy5tZXRhbHN0YWNrLmFwaS52Mi5Td2l0Y2hQb3J0U3RhdHVzQgi6SAWCAQIQAUIKCghfZGVzaXJlZCJSChFNYWNoaW5lQ29ubmVjdGlvbhISCgptYWNoaW5lX2lkGAEgASgJEikKA25pYxgCIAEoCzIcLm1ldGFsc3RhY2suYXBpLnYyLlN3aXRjaE5pYyK5AgoLU3dpdGNoUXVlcnkSHgoCaWQYASABKAlCDbpICnIIwLOusQIBaAFIAIgBARIjCglwYXJ0aXRpb24YAiABKAlCC7pICHIG0LOusQIBSAGIAQESHgoEcmFjaxgDIAEoCUILukgIcgbAs66xAgFIAogBARIeCgRyb29tGAQgASgJQgu6SAhyBsCzrrECAUgDiAEBEjEKAm9zGAUgASgLMiAubWV0YWxzdGFjay5hcGkudjIuU3dpdGNoT1NRdWVyeUgEiAEBEisKFGNvbm5lY3RlZF9tYWNoaW5lX2lkGAYgASgJQgi6SAVyA7ABAUgFiAEBQgUKA19pZEIMCgpfcGFydGl0aW9uQgcKBV9yYWNrQgcKBV9yb29tQgUKA19vc0IXChVfY29ubmVjdGVkX21hY2hpbmVfaWQiiwEKDVN3aXRjaE9TUXVlcnkSQAoGdmVuZG9yGAEgASgOMiEubWV0YWxzdGFjay5hcGkudjIuU3dpdGNoT1NWZW5kb3JCCLpIBYIBAhABSACIAQESIQoHdmVyc2lvbhgCIAEoCUILukgIcgbAs66xAgFIAYgBAUIJCgdfdmVuZG9yQgoKCF92ZXJzaW9uIoEBCgpTd2l0Y2hTeW5jEigKBHRpbWUYASABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEisKCGR1cmF0aW9uGAIgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uEhIKBWVycm9yGAMgASgJSACIAQFCCAoGX2Vycm9yIn8KElN3aXRjaFdpdGhNYWNoaW5lcxIKCgJpZBgBIAEoCRIRCglwYXJ0aXRpb24YAiABKAkSDAoEcmFjaxgDIAEoCRI8Cgtjb25uZWN0aW9ucxgEIAMoCzInLm1ldGFsc3RhY2suYXBpLnYyLlN3aXRjaE5pY1dpdGhNYWNoaW5lIpoBChRTd2l0Y2hOaWNXaXRoTWFjaGluZRIpCgNuaWMYASABKAsyHC5tZXRhbHN0YWNrLmFwaS52Mi5Td2l0Y2hOaWMSKwoHbWFjaGluZRgCIAEoCzIaLm1ldGFsc3RhY2suYXBpLnYyLk1hY2hpbmUSKgoDZnJ1GAMgASgLMh0ubWV0YWxzdGFjay5hcGkudjIuTWFjaGluZUZSVSqJAgoIQkdQU3RhdGUSGQoVQkdQX1NUQVRFX1VOU1BFQ0lGSUVEEAASHAoOQkdQX1NUQVRFX0lETEUQARoIgrIZBElkbGUSIgoRQkdQX1NUQVRFX0NPTk5FQ1QQAhoLgrIZB0Nvbm5lY3QSIAoQQkdQX1NUQVRFX0FDVElWRRADGgqCshkGQWN0aXZlEiUKE0JHUF9TVEFURV9PUEVOX1NFTlQQBBoMgrIZCE9wZW5TZW50EisKFkJHUF9TVEFURV9PUEVOX0NPTkZJUk0QBRoPgrIZC09wZW5Db25maXJtEioKFUJHUF9TVEFURV9FU1RBQkxJU0hFRBAGGg+CshkLRXN0YWJsaXNoZWQqogEKEVN3aXRjaFJlcGxhY2VNb2RlEikKH1NXSVRDSF9SRVBMQUNFX01PREVfVU5TUEVDSUZJRUQQABoEgrIZABIsChtTV0lUQ0hfUkVQTEFDRV9NT0RFX1JFUExBQ0UQARoLgrIZB3JlcGxhY2USNAofU1dJVENIX1JFUExBQ0VfTU9ERV9PUEVSQVRJT05BTBACGg+CshkLb3BlcmF0aW9uYWwqhAEKDlN3aXRjaE9TVmVuZG9yEiAKHFNXSVRDSF9PU19WRU5ET1JfVU5TUEVDSUZJRUQQABIpChhTV0lUQ0hfT1NfVkVORE9SX0NVTVVMVVMQARoLgrIZB0N1bXVsdXMSJQoWU1dJVENIX09TX1ZFTkRPUl9TT05JQxACGgmCshkFU09OaUMqrQEKEFN3aXRjaFBvcnRTdGF0dXMSIgoeU1dJVENIX1BPUlRfU1RBVFVTX1VOU1BFQ0lGSUVEEAASIQoVU1dJVENIX1BPUlRfU1RBVFVTX1VQEAEaBoKyGQJ1cBIlChdTV0lUQ0hfUE9SVF9TVEFUVVNfRE9XThACGgiCshkEZG93bhIrChpTV0lUQ0hfUE9SVF9TVEFUVVNfVU5LTk9XThADGguCshkHdW5rbm93birZAQoUU3dpdGNoUG9ydE1lbWJlcnNoaXASJgoiU1dJVENIX1BPUlRfTUVNQkVSU0hJUF9VTlNQRUNJRklFRBAAEjMKIFNXSVRDSF9QT1JUX01FTUJFUlNISVBfVU5NQU5BR0VEEAEaDYKyGQl1bm1hbmFnZWQSMQofU1dJVENIX1BPUlRfTUVNQkVSU0hJUF9JTlRFUk5BTBACGgyCshkIaW50ZXJuYWwSMQofU1dJVENIX1BPUlRfTUVNQkVSU0hJUF9FWFRFUk5BTBADGgyCshkIZXh0ZXJuYWxCwQEKFWNvbS5tZXRhbHN0YWNrLmFwaS52MkILU3dpdGNoUHJvdG9QAVo1Z2l0aHViLmNvbS9tZXRhbC1zdGFjay9hcGkvZ28vbWV0YWxzdGFjay9hcGkvdjI7YXBpdjKiAgNNQViqAhFNZXRhbHN0YWNrLkFwaS5WMsoCEU1ldGFsc3RhY2tcQXBpXFYy4gIdTWV0YWxzdGFja1xBcGlcVjJcR1BCTWV0YWRhdGHqAhNNZXRhbHN0YWNrOjpBcGk6OlYyYgZwcm90bzM", [file_buf_validate_validate, file_google_protobuf_duration, file_google_protobuf_timestamp, file_metalstack_api_v2_common, file_metalstack_api_v2_machine, file_metalstack_api_v2_predefined_rules]);
/**
* Describes the message metalstack.api.v2.Switch.
* Use `create(SwitchSchema)` to create a new message.
@@ -221,3 +221,40 @@ export var SwitchPortStatus;
* Describes the enum metalstack.api.v2.SwitchPortStatus.
*/
export const SwitchPortStatusSchema = /*@__PURE__*/ enumDesc(file_metalstack_api_v2_switch, 3);
+/**
+ * SwitchPortMembership indicates whether a switch port is connected to an internal or an external host.
+ *
+ * @generated from enum metalstack.api.v2.SwitchPortMembership
+ */
+export var SwitchPortMembership;
+(function (SwitchPortMembership) {
+ /**
+ * SWITCH_PORT_MEMBERSHIP_UNSPECIFIED is not specified.
+ *
+ * @generated from enum value: SWITCH_PORT_MEMBERSHIP_UNSPECIFIED = 0;
+ */
+ SwitchPortMembership[SwitchPortMembership["UNSPECIFIED"] = 0] = "UNSPECIFIED";
+ /**
+ * SWITCH_PORT_MEMBERSHIP_UNMANAGED is a port that isn't connected to any host yet.
+ *
+ * @generated from enum value: SWITCH_PORT_MEMBERSHIP_UNMANAGED = 1;
+ */
+ SwitchPortMembership[SwitchPortMembership["UNMANAGED"] = 1] = "UNMANAGED";
+ /**
+ * SWITCH_PORT_MEMBERSHIP_INTERNAL is port that is connected to a host that is registered at the api, e.g. a registered machine.
+ *
+ * @generated from enum value: SWITCH_PORT_MEMBERSHIP_INTERNAL = 2;
+ */
+ SwitchPortMembership[SwitchPortMembership["INTERNAL"] = 2] = "INTERNAL";
+ /**
+ * SWITCH_PORT_MEMBERSHIP_EXTERNAL is port that is connected to a host that is not registered at the api.
+ * This value allows connecting an external system to a network managed by us.
+ *
+ * @generated from enum value: SWITCH_PORT_MEMBERSHIP_EXTERNAL = 3;
+ */
+ SwitchPortMembership[SwitchPortMembership["EXTERNAL"] = 3] = "EXTERNAL";
+})(SwitchPortMembership || (SwitchPortMembership = {}));
+/**
+ * Describes the enum metalstack.api.v2.SwitchPortMembership.
+ */
+export const SwitchPortMembershipSchema = /*@__PURE__*/ enumDesc(file_metalstack_api_v2_switch, 4);
diff --git a/js/metalstack/api/v2/switch_pb.ts b/js/metalstack/api/v2/switch_pb.ts
index e821ad27..6b3ba2a2 100644
--- a/js/metalstack/api/v2/switch_pb.ts
+++ b/js/metalstack/api/v2/switch_pb.ts
@@ -18,7 +18,7 @@ import type { Message } from "@bufbuild/protobuf";
* Describes the file metalstack/api/v2/switch.proto.
*/
export const file_metalstack_api_v2_switch: GenFile = /*@__PURE__*/
- fileDesc("Ch5tZXRhbHN0YWNrL2FwaS92Mi9zd2l0Y2gucHJvdG8SEW1ldGFsc3RhY2suYXBpLnYyIsIFCgZTd2l0Y2gSGQoCaWQYASABKAlCDbpICnIIwLOusQIBaAESJQoEbWV0YRgCIAEoCzIXLm1ldGFsc3RhY2suYXBpLnYyLk1ldGESIAoLZGVzY3JpcHRpb24YAyABKAlCC7pICHIGyLOusQIBEh4KBHJhY2sYBCABKAlCC7pICHIGwLOusQIBSACIAQESHgoEcm9vbRgFIAEoCUILukgIcgbAs66xAgFIAYgBARIeCglwYXJ0aXRpb24YBiABKAlCC7pICHIG0LOusQIBEkQKDHJlcGxhY2VfbW9kZRgHIAEoDjIkLm1ldGFsc3RhY2suYXBpLnYyLlN3aXRjaFJlcGxhY2VNb2RlQgi6SAWCAQIQARIeCg1tYW5hZ2VtZW50X2lwGAggASgJQge6SARyAnABEigKD21hbmFnZW1lbnRfdXNlchgJIAEoCUIKukgHcgUQAhiAAUgCiAEBEigKD2NvbnNvbGVfY29tbWFuZBgKIAEoCUIKukgHcgUQAhiAAUgDiAEBEioKBG5pY3MYCyADKAsyHC5tZXRhbHN0YWNrLmFwaS52Mi5Td2l0Y2hOaWMSJwoCb3MYDCABKAsyGy5tZXRhbHN0YWNrLmFwaS52Mi5Td2l0Y2hPUxJBChNtYWNoaW5lX2Nvbm5lY3Rpb25zGA0gAygLMiQubWV0YWxzdGFjay5hcGkudjIuTWFjaGluZUNvbm5lY3Rpb24SMAoJbGFzdF9zeW5jGA4gASgLMh0ubWV0YWxzdGFjay5hcGkudjIuU3dpdGNoU3luYxI2Cg9sYXN0X3N5bmNfZXJyb3IYDyABKAsyHS5tZXRhbHN0YWNrLmFwaS52Mi5Td2l0Y2hTeW5jQgcKBV9yYWNrQgcKBV9yb29tQhIKEF9tYW5hZ2VtZW50X3VzZXJCEgoQX2NvbnNvbGVfY29tbWFuZCKOAQoIU3dpdGNoT1MSOwoGdmVuZG9yGAEgASgOMiEubWV0YWxzdGFjay5hcGkudjIuU3dpdGNoT1NWZW5kb3JCCLpIBYIBAhABEhwKB3ZlcnNpb24YAiABKAlCC7pICHIGwLOusQIBEicKEm1ldGFsX2NvcmVfdmVyc2lvbhgDIAEoCUILukgIcgbAs66xAgEi7QIKCVN3aXRjaE5pYxIZCgRuYW1lGAEgASgJQgu6SAhyBsCzrrECARIfCgppZGVudGlmaWVyGAIgASgJQgu6SAhyBsCzrrECARIdCgNtYWMYAyABKAlCC7pICHIGuLOusQIBSACIAQESHQoDdnJmGAQgASgJQgu6SAhyBsCzrrECAUgBiAEBEi8KBXN0YXRlGAUgASgLMhsubWV0YWxzdGFjay5hcGkudjIuTmljU3RhdGVIAogBARI1CgpiZ3BfZmlsdGVyGAYgASgLMhwubWV0YWxzdGFjay5hcGkudjIuQkdQRmlsdGVySAOIAQESQgoOYmdwX3BvcnRfc3RhdGUYByABKAsyJS5tZXRhbHN0YWNrLmFwaS52Mi5Td2l0Y2hCR1BQb3J0U3RhdGVIBIgBAUIGCgRfbWFjQgYKBF92cmZCCAoGX3N0YXRlQg0KC19iZ3BfZmlsdGVyQhEKD19iZ3BfcG9ydF9zdGF0ZSJHCglCR1BGaWx0ZXISGwoFY2lkcnMYASADKAlCDLpICZIBBriks7ECARIdCgR2bmlzGAIgAygJQg+6SAySAQkiB3IFEAIYgAEiqQIKElN3aXRjaEJHUFBvcnRTdGF0ZRIdCghuZWlnaGJvchgBIAEoCUILukgIcgbAs66xAgESHwoKcGVlcl9ncm91cBgCIAEoCUILukgIcgbAs66xAgESHQoIdnJmX25hbWUYAyABKAlCC7pICHIGwLOusQIBEjgKCWJncF9zdGF0ZRgEIAEoDjIbLm1ldGFsc3RhY2suYXBpLnYyLkJHUFN0YXRlQgi6SAWCAQIQARI8ChhiZ3BfdGltZXJfdXBfZXN0YWJsaXNoZWQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhsKE3NlbnRfcHJlZml4X2NvdW50ZXIYBiABKAQSHwoXYWNjZXB0ZWRfcHJlZml4X2NvdW50ZXIYByABKAQimgEKCE5pY1N0YXRlEkMKB2Rlc2lyZWQYASABKA4yIy5tZXRhbHN0YWNrLmFwaS52Mi5Td2l0Y2hQb3J0U3RhdHVzQgi6SAWCAQIQAUgAiAEBEj0KBmFjdHVhbBgCIAEoDjIjLm1ldGFsc3RhY2suYXBpLnYyLlN3aXRjaFBvcnRTdGF0dXNCCLpIBYIBAhABQgoKCF9kZXNpcmVkIlIKEU1hY2hpbmVDb25uZWN0aW9uEhIKCm1hY2hpbmVfaWQYASABKAkSKQoDbmljGAIgASgLMhwubWV0YWxzdGFjay5hcGkudjIuU3dpdGNoTmljIrkCCgtTd2l0Y2hRdWVyeRIeCgJpZBgBIAEoCUINukgKcgjAs66xAgFoAUgAiAEBEiMKCXBhcnRpdGlvbhgCIAEoCUILukgIcgbQs66xAgFIAYgBARIeCgRyYWNrGAMgASgJQgu6SAhyBsCzrrECAUgCiAEBEh4KBHJvb20YBCABKAlCC7pICHIGwLOusQIBSAOIAQESMQoCb3MYBSABKAsyIC5tZXRhbHN0YWNrLmFwaS52Mi5Td2l0Y2hPU1F1ZXJ5SASIAQESKwoUY29ubmVjdGVkX21hY2hpbmVfaWQYBiABKAlCCLpIBXIDsAEBSAWIAQFCBQoDX2lkQgwKCl9wYXJ0aXRpb25CBwoFX3JhY2tCBwoFX3Jvb21CBQoDX29zQhcKFV9jb25uZWN0ZWRfbWFjaGluZV9pZCKLAQoNU3dpdGNoT1NRdWVyeRJACgZ2ZW5kb3IYASABKA4yIS5tZXRhbHN0YWNrLmFwaS52Mi5Td2l0Y2hPU1ZlbmRvckIIukgFggECEAFIAIgBARIhCgd2ZXJzaW9uGAIgASgJQgu6SAhyBsCzrrECAUgBiAEBQgkKB192ZW5kb3JCCgoIX3ZlcnNpb24igQEKClN3aXRjaFN5bmMSKAoEdGltZRgBIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASKwoIZHVyYXRpb24YAiABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb24SEgoFZXJyb3IYAyABKAlIAIgBAUIICgZfZXJyb3IifwoSU3dpdGNoV2l0aE1hY2hpbmVzEgoKAmlkGAEgASgJEhEKCXBhcnRpdGlvbhgCIAEoCRIMCgRyYWNrGAMgASgJEjwKC2Nvbm5lY3Rpb25zGAQgAygLMicubWV0YWxzdGFjay5hcGkudjIuU3dpdGNoTmljV2l0aE1hY2hpbmUimgEKFFN3aXRjaE5pY1dpdGhNYWNoaW5lEikKA25pYxgBIAEoCzIcLm1ldGFsc3RhY2suYXBpLnYyLlN3aXRjaE5pYxIrCgdtYWNoaW5lGAIgASgLMhoubWV0YWxzdGFjay5hcGkudjIuTWFjaGluZRIqCgNmcnUYAyABKAsyHS5tZXRhbHN0YWNrLmFwaS52Mi5NYWNoaW5lRlJVKokCCghCR1BTdGF0ZRIZChVCR1BfU1RBVEVfVU5TUEVDSUZJRUQQABIcCg5CR1BfU1RBVEVfSURMRRABGgiCshkESWRsZRIiChFCR1BfU1RBVEVfQ09OTkVDVBACGguCshkHQ29ubmVjdBIgChBCR1BfU1RBVEVfQUNUSVZFEAMaCoKyGQZBY3RpdmUSJQoTQkdQX1NUQVRFX09QRU5fU0VOVBAEGgyCshkIT3BlblNlbnQSKwoWQkdQX1NUQVRFX09QRU5fQ09ORklSTRAFGg+CshkLT3BlbkNvbmZpcm0SKgoVQkdQX1NUQVRFX0VTVEFCTElTSEVEEAYaD4KyGQtFc3RhYmxpc2hlZCqiAQoRU3dpdGNoUmVwbGFjZU1vZGUSKQofU1dJVENIX1JFUExBQ0VfTU9ERV9VTlNQRUNJRklFRBAAGgSCshkAEiwKG1NXSVRDSF9SRVBMQUNFX01PREVfUkVQTEFDRRABGguCshkHcmVwbGFjZRI0Ch9TV0lUQ0hfUkVQTEFDRV9NT0RFX09QRVJBVElPTkFMEAIaD4KyGQtvcGVyYXRpb25hbCqEAQoOU3dpdGNoT1NWZW5kb3ISIAocU1dJVENIX09TX1ZFTkRPUl9VTlNQRUNJRklFRBAAEikKGFNXSVRDSF9PU19WRU5ET1JfQ1VNVUxVUxABGguCshkHQ3VtdWx1cxIlChZTV0lUQ0hfT1NfVkVORE9SX1NPTklDEAIaCYKyGQVTT05pQyqtAQoQU3dpdGNoUG9ydFN0YXR1cxIiCh5TV0lUQ0hfUE9SVF9TVEFUVVNfVU5TUEVDSUZJRUQQABIhChVTV0lUQ0hfUE9SVF9TVEFUVVNfVVAQARoGgrIZAnVwEiUKF1NXSVRDSF9QT1JUX1NUQVRVU19ET1dOEAIaCIKyGQRkb3duEisKGlNXSVRDSF9QT1JUX1NUQVRVU19VTktOT1dOEAMaC4KyGQd1bmtub3duQsEBChVjb20ubWV0YWxzdGFjay5hcGkudjJCC1N3aXRjaFByb3RvUAFaNWdpdGh1Yi5jb20vbWV0YWwtc3RhY2svYXBpL2dvL21ldGFsc3RhY2svYXBpL3YyO2FwaXYyogIDTUFYqgIRTWV0YWxzdGFjay5BcGkuVjLKAhFNZXRhbHN0YWNrXEFwaVxWMuICHU1ldGFsc3RhY2tcQXBpXFYyXEdQQk1ldGFkYXRh6gITTWV0YWxzdGFjazo6QXBpOjpWMmIGcHJvdG8z", [file_buf_validate_validate, file_google_protobuf_duration, file_google_protobuf_timestamp, file_metalstack_api_v2_common, file_metalstack_api_v2_machine, file_metalstack_api_v2_predefined_rules]);
+ fileDesc("Ch5tZXRhbHN0YWNrL2FwaS92Mi9zd2l0Y2gucHJvdG8SEW1ldGFsc3RhY2suYXBpLnYyIsIFCgZTd2l0Y2gSGQoCaWQYASABKAlCDbpICnIIwLOusQIBaAESJQoEbWV0YRgCIAEoCzIXLm1ldGFsc3RhY2suYXBpLnYyLk1ldGESIAoLZGVzY3JpcHRpb24YAyABKAlCC7pICHIGyLOusQIBEh4KBHJhY2sYBCABKAlCC7pICHIGwLOusQIBSACIAQESHgoEcm9vbRgFIAEoCUILukgIcgbAs66xAgFIAYgBARIeCglwYXJ0aXRpb24YBiABKAlCC7pICHIG0LOusQIBEkQKDHJlcGxhY2VfbW9kZRgHIAEoDjIkLm1ldGFsc3RhY2suYXBpLnYyLlN3aXRjaFJlcGxhY2VNb2RlQgi6SAWCAQIQARIeCg1tYW5hZ2VtZW50X2lwGAggASgJQge6SARyAnABEigKD21hbmFnZW1lbnRfdXNlchgJIAEoCUIKukgHcgUQAhiAAUgCiAEBEigKD2NvbnNvbGVfY29tbWFuZBgKIAEoCUIKukgHcgUQAhiAAUgDiAEBEioKBG5pY3MYCyADKAsyHC5tZXRhbHN0YWNrLmFwaS52Mi5Td2l0Y2hOaWMSJwoCb3MYDCABKAsyGy5tZXRhbHN0YWNrLmFwaS52Mi5Td2l0Y2hPUxJBChNtYWNoaW5lX2Nvbm5lY3Rpb25zGA0gAygLMiQubWV0YWxzdGFjay5hcGkudjIuTWFjaGluZUNvbm5lY3Rpb24SMAoJbGFzdF9zeW5jGA4gASgLMh0ubWV0YWxzdGFjay5hcGkudjIuU3dpdGNoU3luYxI2Cg9sYXN0X3N5bmNfZXJyb3IYDyABKAsyHS5tZXRhbHN0YWNrLmFwaS52Mi5Td2l0Y2hTeW5jQgcKBV9yYWNrQgcKBV9yb29tQhIKEF9tYW5hZ2VtZW50X3VzZXJCEgoQX2NvbnNvbGVfY29tbWFuZCKOAQoIU3dpdGNoT1MSOwoGdmVuZG9yGAEgASgOMiEubWV0YWxzdGFjay5hcGkudjIuU3dpdGNoT1NWZW5kb3JCCLpIBYIBAhABEhwKB3ZlcnNpb24YAiABKAlCC7pICHIGwLOusQIBEicKEm1ldGFsX2NvcmVfdmVyc2lvbhgDIAEoCUILukgIcgbAs66xAgEiqgMKCVN3aXRjaE5pYxIZCgRuYW1lGAEgASgJQgu6SAhyBsCzrrECARIfCgppZGVudGlmaWVyGAIgASgJQgu6SAhyBsCzrrECARIdCgNtYWMYAyABKAlCC7pICHIGuLOusQIBSACIAQESHQoDdnJmGAQgASgJQgu6SAhyBsCzrrECAUgBiAEBEi8KBXN0YXRlGAUgASgLMhsubWV0YWxzdGFjay5hcGkudjIuTmljU3RhdGVIAogBARI1CgpiZ3BfZmlsdGVyGAYgASgLMhwubWV0YWxzdGFjay5hcGkudjIuQkdQRmlsdGVySAOIAQESQgoOYmdwX3BvcnRfc3RhdGUYByABKAsyJS5tZXRhbHN0YWNrLmFwaS52Mi5Td2l0Y2hCR1BQb3J0U3RhdGVIBIgBARI7CgptZW1iZXJzaGlwGAggASgOMicubWV0YWxzdGFjay5hcGkudjIuU3dpdGNoUG9ydE1lbWJlcnNoaXBCBgoEX21hY0IGCgRfdnJmQggKBl9zdGF0ZUINCgtfYmdwX2ZpbHRlckIRCg9fYmdwX3BvcnRfc3RhdGUiRwoJQkdQRmlsdGVyEhsKBWNpZHJzGAEgAygJQgy6SAmSAQa4pLOxAgESHQoEdm5pcxgCIAMoCUIPukgMkgEJIgdyBRACGIABIqkCChJTd2l0Y2hCR1BQb3J0U3RhdGUSHQoIbmVpZ2hib3IYASABKAlCC7pICHIGwLOusQIBEh8KCnBlZXJfZ3JvdXAYAiABKAlCC7pICHIGwLOusQIBEh0KCHZyZl9uYW1lGAMgASgJQgu6SAhyBsCzrrECARI4CgliZ3Bfc3RhdGUYBCABKA4yGy5tZXRhbHN0YWNrLmFwaS52Mi5CR1BTdGF0ZUIIukgFggECEAESPAoYYmdwX3RpbWVyX3VwX2VzdGFibGlzaGVkGAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIbChNzZW50X3ByZWZpeF9jb3VudGVyGAYgASgEEh8KF2FjY2VwdGVkX3ByZWZpeF9jb3VudGVyGAcgASgEIpoBCghOaWNTdGF0ZRJDCgdkZXNpcmVkGAEgASgOMiMubWV0YWxzdGFjay5hcGkudjIuU3dpdGNoUG9ydFN0YXR1c0IIukgFggECEAFIAIgBARI9CgZhY3R1YWwYAiABKA4yIy5tZXRhbHN0YWNrLmFwaS52Mi5Td2l0Y2hQb3J0U3RhdHVzQgi6SAWCAQIQAUIKCghfZGVzaXJlZCJSChFNYWNoaW5lQ29ubmVjdGlvbhISCgptYWNoaW5lX2lkGAEgASgJEikKA25pYxgCIAEoCzIcLm1ldGFsc3RhY2suYXBpLnYyLlN3aXRjaE5pYyK5AgoLU3dpdGNoUXVlcnkSHgoCaWQYASABKAlCDbpICnIIwLOusQIBaAFIAIgBARIjCglwYXJ0aXRpb24YAiABKAlCC7pICHIG0LOusQIBSAGIAQESHgoEcmFjaxgDIAEoCUILukgIcgbAs66xAgFIAogBARIeCgRyb29tGAQgASgJQgu6SAhyBsCzrrECAUgDiAEBEjEKAm9zGAUgASgLMiAubWV0YWxzdGFjay5hcGkudjIuU3dpdGNoT1NRdWVyeUgEiAEBEisKFGNvbm5lY3RlZF9tYWNoaW5lX2lkGAYgASgJQgi6SAVyA7ABAUgFiAEBQgUKA19pZEIMCgpfcGFydGl0aW9uQgcKBV9yYWNrQgcKBV9yb29tQgUKA19vc0IXChVfY29ubmVjdGVkX21hY2hpbmVfaWQiiwEKDVN3aXRjaE9TUXVlcnkSQAoGdmVuZG9yGAEgASgOMiEubWV0YWxzdGFjay5hcGkudjIuU3dpdGNoT1NWZW5kb3JCCLpIBYIBAhABSACIAQESIQoHdmVyc2lvbhgCIAEoCUILukgIcgbAs66xAgFIAYgBAUIJCgdfdmVuZG9yQgoKCF92ZXJzaW9uIoEBCgpTd2l0Y2hTeW5jEigKBHRpbWUYASABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEisKCGR1cmF0aW9uGAIgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uEhIKBWVycm9yGAMgASgJSACIAQFCCAoGX2Vycm9yIn8KElN3aXRjaFdpdGhNYWNoaW5lcxIKCgJpZBgBIAEoCRIRCglwYXJ0aXRpb24YAiABKAkSDAoEcmFjaxgDIAEoCRI8Cgtjb25uZWN0aW9ucxgEIAMoCzInLm1ldGFsc3RhY2suYXBpLnYyLlN3aXRjaE5pY1dpdGhNYWNoaW5lIpoBChRTd2l0Y2hOaWNXaXRoTWFjaGluZRIpCgNuaWMYASABKAsyHC5tZXRhbHN0YWNrLmFwaS52Mi5Td2l0Y2hOaWMSKwoHbWFjaGluZRgCIAEoCzIaLm1ldGFsc3RhY2suYXBpLnYyLk1hY2hpbmUSKgoDZnJ1GAMgASgLMh0ubWV0YWxzdGFjay5hcGkudjIuTWFjaGluZUZSVSqJAgoIQkdQU3RhdGUSGQoVQkdQX1NUQVRFX1VOU1BFQ0lGSUVEEAASHAoOQkdQX1NUQVRFX0lETEUQARoIgrIZBElkbGUSIgoRQkdQX1NUQVRFX0NPTk5FQ1QQAhoLgrIZB0Nvbm5lY3QSIAoQQkdQX1NUQVRFX0FDVElWRRADGgqCshkGQWN0aXZlEiUKE0JHUF9TVEFURV9PUEVOX1NFTlQQBBoMgrIZCE9wZW5TZW50EisKFkJHUF9TVEFURV9PUEVOX0NPTkZJUk0QBRoPgrIZC09wZW5Db25maXJtEioKFUJHUF9TVEFURV9FU1RBQkxJU0hFRBAGGg+CshkLRXN0YWJsaXNoZWQqogEKEVN3aXRjaFJlcGxhY2VNb2RlEikKH1NXSVRDSF9SRVBMQUNFX01PREVfVU5TUEVDSUZJRUQQABoEgrIZABIsChtTV0lUQ0hfUkVQTEFDRV9NT0RFX1JFUExBQ0UQARoLgrIZB3JlcGxhY2USNAofU1dJVENIX1JFUExBQ0VfTU9ERV9PUEVSQVRJT05BTBACGg+CshkLb3BlcmF0aW9uYWwqhAEKDlN3aXRjaE9TVmVuZG9yEiAKHFNXSVRDSF9PU19WRU5ET1JfVU5TUEVDSUZJRUQQABIpChhTV0lUQ0hfT1NfVkVORE9SX0NVTVVMVVMQARoLgrIZB0N1bXVsdXMSJQoWU1dJVENIX09TX1ZFTkRPUl9TT05JQxACGgmCshkFU09OaUMqrQEKEFN3aXRjaFBvcnRTdGF0dXMSIgoeU1dJVENIX1BPUlRfU1RBVFVTX1VOU1BFQ0lGSUVEEAASIQoVU1dJVENIX1BPUlRfU1RBVFVTX1VQEAEaBoKyGQJ1cBIlChdTV0lUQ0hfUE9SVF9TVEFUVVNfRE9XThACGgiCshkEZG93bhIrChpTV0lUQ0hfUE9SVF9TVEFUVVNfVU5LTk9XThADGguCshkHdW5rbm93birZAQoUU3dpdGNoUG9ydE1lbWJlcnNoaXASJgoiU1dJVENIX1BPUlRfTUVNQkVSU0hJUF9VTlNQRUNJRklFRBAAEjMKIFNXSVRDSF9QT1JUX01FTUJFUlNISVBfVU5NQU5BR0VEEAEaDYKyGQl1bm1hbmFnZWQSMQofU1dJVENIX1BPUlRfTUVNQkVSU0hJUF9JTlRFUk5BTBACGgyCshkIaW50ZXJuYWwSMQofU1dJVENIX1BPUlRfTUVNQkVSU0hJUF9FWFRFUk5BTBADGgyCshkIZXh0ZXJuYWxCwQEKFWNvbS5tZXRhbHN0YWNrLmFwaS52MkILU3dpdGNoUHJvdG9QAVo1Z2l0aHViLmNvbS9tZXRhbC1zdGFjay9hcGkvZ28vbWV0YWxzdGFjay9hcGkvdjI7YXBpdjKiAgNNQViqAhFNZXRhbHN0YWNrLkFwaS5WMsoCEU1ldGFsc3RhY2tcQXBpXFYy4gIdTWV0YWxzdGFja1xBcGlcVjJcR1BCTWV0YWRhdGHqAhNNZXRhbHN0YWNrOjpBcGk6OlYyYgZwcm90bzM", [file_buf_validate_validate, file_google_protobuf_duration, file_google_protobuf_timestamp, file_metalstack_api_v2_common, file_metalstack_api_v2_machine, file_metalstack_api_v2_predefined_rules]);
/**
* Switch represents a network switch.
@@ -228,6 +228,13 @@ export type SwitchNic = Message<"metalstack.api.v2.SwitchNic"> & {
* @generated from field: optional metalstack.api.v2.SwitchBGPPortState bgp_port_state = 7;
*/
bgpPortState?: SwitchBGPPortState | undefined;
+
+ /**
+ * Membership indicates whether the port is connected to an internal or external host.
+ *
+ * @generated from field: metalstack.api.v2.SwitchPortMembership membership = 8;
+ */
+ membership: SwitchPortMembership;
};
/**
@@ -751,3 +758,45 @@ export enum SwitchPortStatus {
export const SwitchPortStatusSchema: GenEnum = /*@__PURE__*/
enumDesc(file_metalstack_api_v2_switch, 3);
+/**
+ * SwitchPortMembership indicates whether a switch port is connected to an internal or an external host.
+ *
+ * @generated from enum metalstack.api.v2.SwitchPortMembership
+ */
+export enum SwitchPortMembership {
+ /**
+ * SWITCH_PORT_MEMBERSHIP_UNSPECIFIED is not specified.
+ *
+ * @generated from enum value: SWITCH_PORT_MEMBERSHIP_UNSPECIFIED = 0;
+ */
+ UNSPECIFIED = 0,
+
+ /**
+ * SWITCH_PORT_MEMBERSHIP_UNMANAGED is a port that isn't connected to any host yet.
+ *
+ * @generated from enum value: SWITCH_PORT_MEMBERSHIP_UNMANAGED = 1;
+ */
+ UNMANAGED = 1,
+
+ /**
+ * SWITCH_PORT_MEMBERSHIP_INTERNAL is port that is connected to a host that is registered at the api, e.g. a registered machine.
+ *
+ * @generated from enum value: SWITCH_PORT_MEMBERSHIP_INTERNAL = 2;
+ */
+ INTERNAL = 2,
+
+ /**
+ * SWITCH_PORT_MEMBERSHIP_EXTERNAL is port that is connected to a host that is not registered at the api.
+ * This value allows connecting an external system to a network managed by us.
+ *
+ * @generated from enum value: SWITCH_PORT_MEMBERSHIP_EXTERNAL = 3;
+ */
+ EXTERNAL = 3,
+}
+
+/**
+ * Describes the enum metalstack.api.v2.SwitchPortMembership.
+ */
+export const SwitchPortMembershipSchema: GenEnum = /*@__PURE__*/
+ enumDesc(file_metalstack_api_v2_switch, 4);
+
diff --git a/proto/Makefile b/proto/Makefile
index 254443ef..ef600128 100644
--- a/proto/Makefile
+++ b/proto/Makefile
@@ -13,7 +13,7 @@ _buf:
protolint:
@$(MAKE) _buf CMD="format -w"
@$(MAKE) _buf CMD="lint -v"
- # @$(MAKE) _buf CMD="breaking --against 'https://github.com/metal-stack/api.git#branch=main,subdir=proto'"
+ @$(MAKE) _buf CMD="breaking --against 'https://github.com/metal-stack/api.git#branch=main,subdir=proto'"
.PHONY: protoc
protoc:
diff --git a/proto/metalstack/api/v2/switch.proto b/proto/metalstack/api/v2/switch.proto
index 6882cdb1..17e4c94c 100644
--- a/proto/metalstack/api/v2/switch.proto
+++ b/proto/metalstack/api/v2/switch.proto
@@ -78,6 +78,8 @@ message SwitchNic {
optional BGPFilter bgp_filter = 6;
// BGPPortState represents the current BGP status of the port.
optional SwitchBGPPortState bgp_port_state = 7;
+ // Membership indicates whether the port is connected to an internal or external host.
+ SwitchPortMembership membership = 8;
}
// BGPFilter can be used to restrict BGP based on CIDRs and VNIs.
@@ -233,3 +235,16 @@ enum SwitchPortStatus {
// SWITCH_PORT_STATUS_UNKNOWN means the status of this port is unknown.
SWITCH_PORT_STATUS_UNKNOWN = 3 [(enum_string_value) = "unknown"];
}
+
+// SwitchPortMembership indicates whether a switch port is connected to an internal or an external host.
+enum SwitchPortMembership {
+ // SWITCH_PORT_MEMBERSHIP_UNSPECIFIED is not specified.
+ SWITCH_PORT_MEMBERSHIP_UNSPECIFIED = 0;
+ // SWITCH_PORT_MEMBERSHIP_UNMANAGED is a port that isn't connected to any host yet.
+ SWITCH_PORT_MEMBERSHIP_UNMANAGED = 1 [(enum_string_value) = "unmanaged"];
+ // SWITCH_PORT_MEMBERSHIP_INTERNAL is port that is connected to a host that is registered at the api, e.g. a registered machine.
+ SWITCH_PORT_MEMBERSHIP_INTERNAL = 2 [(enum_string_value) = "internal"];
+ // SWITCH_PORT_MEMBERSHIP_EXTERNAL is port that is connected to a host that is not registered at the api.
+ // This value allows connecting an external system to a network managed by us.
+ SWITCH_PORT_MEMBERSHIP_EXTERNAL = 3 [(enum_string_value) = "external"];
+}
diff --git a/python/metalstack/api/v2/switch_pb2.py b/python/metalstack/api/v2/switch_pb2.py
index d690c3e8..7355fed2 100644
--- a/python/metalstack/api/v2/switch_pb2.py
+++ b/python/metalstack/api/v2/switch_pb2.py
@@ -30,7 +30,7 @@
from metalstack.api.v2 import predefined_rules_pb2 as metalstack_dot_api_dot_v2_dot_predefined__rules__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emetalstack/api/v2/switch.proto\x12\x11metalstack.api.v2\x1a\x1b\x62uf/validate/validate.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1emetalstack/api/v2/common.proto\x1a\x1fmetalstack/api/v2/machine.proto\x1a(metalstack/api/v2/predefined_rules.proto\"\xe2\x06\n\x06Switch\x12\x1d\n\x02id\x18\x01 \x01(\tB\r\xbaH\nr\x08h\x01\xc0\xb3\xae\xb1\x02\x01R\x02id\x12+\n\x04meta\x18\x02 \x01(\x0b\x32\x17.metalstack.api.v2.MetaR\x04meta\x12-\n\x0b\x64\x65scription\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc8\xb3\xae\xb1\x02\x01R\x0b\x64\x65scription\x12$\n\x04rack\x18\x04 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01H\x00R\x04rack\x88\x01\x01\x12$\n\x04room\x18\x05 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01H\x01R\x04room\x88\x01\x01\x12)\n\tpartition\x18\x06 \x01(\tB\x0b\xbaH\x08r\x06\xd0\xb3\xae\xb1\x02\x01R\tpartition\x12Q\n\x0creplace_mode\x18\x07 \x01(\x0e\x32$.metalstack.api.v2.SwitchReplaceModeB\x08\xbaH\x05\x82\x01\x02\x10\x01R\x0breplaceMode\x12,\n\rmanagement_ip\x18\x08 \x01(\tB\x07\xbaH\x04r\x02p\x01R\x0cmanagementIp\x12\x38\n\x0fmanagement_user\x18\t \x01(\tB\n\xbaH\x07r\x05\x10\x02\x18\x80\x01H\x02R\x0emanagementUser\x88\x01\x01\x12\x38\n\x0f\x63onsole_command\x18\n \x01(\tB\n\xbaH\x07r\x05\x10\x02\x18\x80\x01H\x03R\x0e\x63onsoleCommand\x88\x01\x01\x12\x30\n\x04nics\x18\x0b \x03(\x0b\x32\x1c.metalstack.api.v2.SwitchNicR\x04nics\x12+\n\x02os\x18\x0c \x01(\x0b\x32\x1b.metalstack.api.v2.SwitchOSR\x02os\x12U\n\x13machine_connections\x18\r \x03(\x0b\x32$.metalstack.api.v2.MachineConnectionR\x12machineConnections\x12:\n\tlast_sync\x18\x0e \x01(\x0b\x32\x1d.metalstack.api.v2.SwitchSyncR\x08lastSync\x12\x45\n\x0flast_sync_error\x18\x0f \x01(\x0b\x32\x1d.metalstack.api.v2.SwitchSyncR\rlastSyncErrorB\x07\n\x05_rackB\x07\n\x05_roomB\x12\n\x10_management_userB\x12\n\x10_console_command\"\xb1\x01\n\x08SwitchOS\x12\x43\n\x06vendor\x18\x01 \x01(\x0e\x32!.metalstack.api.v2.SwitchOSVendorB\x08\xbaH\x05\x82\x01\x02\x10\x01R\x06vendor\x12%\n\x07version\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x07version\x12\x39\n\x12metal_core_version\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x10metalCoreVersion\"\xa9\x03\n\tSwitchNic\x12\x1f\n\x04name\x18\x01 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x04name\x12+\n\nidentifier\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\nidentifier\x12\"\n\x03mac\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xb8\xb3\xae\xb1\x02\x01H\x00R\x03mac\x88\x01\x01\x12\"\n\x03vrf\x18\x04 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01H\x01R\x03vrf\x88\x01\x01\x12\x36\n\x05state\x18\x05 \x01(\x0b\x32\x1b.metalstack.api.v2.NicStateH\x02R\x05state\x88\x01\x01\x12@\n\nbgp_filter\x18\x06 \x01(\x0b\x32\x1c.metalstack.api.v2.BGPFilterH\x03R\tbgpFilter\x88\x01\x01\x12P\n\x0e\x62gp_port_state\x18\x07 \x01(\x0b\x32%.metalstack.api.v2.SwitchBGPPortStateH\x04R\x0c\x62gpPortState\x88\x01\x01\x42\x06\n\x04_macB\x06\n\x04_vrfB\x08\n\x06_stateB\r\n\x0b_bgp_filterB\x11\n\x0f_bgp_port_state\"T\n\tBGPFilter\x12\"\n\x05\x63idrs\x18\x01 \x03(\tB\x0c\xbaH\t\x92\x01\x06\xb8\xa4\xb3\xb1\x02\x01R\x05\x63idrs\x12#\n\x04vnis\x18\x02 \x03(\tB\x0f\xbaH\x0c\x92\x01\t\"\x07r\x05\x10\x02\x18\x80\x01R\x04vnis\"\x92\x03\n\x12SwitchBGPPortState\x12\'\n\x08neighbor\x18\x01 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x08neighbor\x12*\n\npeer_group\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\tpeerGroup\x12&\n\x08vrf_name\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x07vrfName\x12\x42\n\tbgp_state\x18\x04 \x01(\x0e\x32\x1b.metalstack.api.v2.BGPStateB\x08\xbaH\x05\x82\x01\x02\x10\x01R\x08\x62gpState\x12S\n\x18\x62gp_timer_up_established\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x15\x62gpTimerUpEstablished\x12.\n\x13sent_prefix_counter\x18\x06 \x01(\x04R\x11sentPrefixCounter\x12\x36\n\x17\x61\x63\x63\x65pted_prefix_counter\x18\x07 \x01(\x04R\x15\x61\x63\x63\x65ptedPrefixCounter\"\xab\x01\n\x08NicState\x12L\n\x07\x64\x65sired\x18\x01 \x01(\x0e\x32#.metalstack.api.v2.SwitchPortStatusB\x08\xbaH\x05\x82\x01\x02\x10\x01H\x00R\x07\x64\x65sired\x88\x01\x01\x12\x45\n\x06\x61\x63tual\x18\x02 \x01(\x0e\x32#.metalstack.api.v2.SwitchPortStatusB\x08\xbaH\x05\x82\x01\x02\x10\x01R\x06\x61\x63tualB\n\n\x08_desired\"b\n\x11MachineConnection\x12\x1d\n\nmachine_id\x18\x01 \x01(\tR\tmachineId\x12.\n\x03nic\x18\x02 \x01(\x0b\x32\x1c.metalstack.api.v2.SwitchNicR\x03nic\"\xec\x02\n\x0bSwitchQuery\x12\"\n\x02id\x18\x01 \x01(\tB\r\xbaH\nr\x08h\x01\xc0\xb3\xae\xb1\x02\x01H\x00R\x02id\x88\x01\x01\x12.\n\tpartition\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xd0\xb3\xae\xb1\x02\x01H\x01R\tpartition\x88\x01\x01\x12$\n\x04rack\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01H\x02R\x04rack\x88\x01\x01\x12$\n\x04room\x18\x04 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01H\x03R\x04room\x88\x01\x01\x12\x35\n\x02os\x18\x05 \x01(\x0b\x32 .metalstack.api.v2.SwitchOSQueryH\x04R\x02os\x88\x01\x01\x12?\n\x14\x63onnected_machine_id\x18\x06 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01H\x05R\x12\x63onnectedMachineId\x88\x01\x01\x42\x05\n\x03_idB\x0c\n\n_partitionB\x07\n\x05_rackB\x07\n\x05_roomB\x05\n\x03_osB\x17\n\x15_connected_machine_id\"\x9c\x01\n\rSwitchOSQuery\x12H\n\x06vendor\x18\x01 \x01(\x0e\x32!.metalstack.api.v2.SwitchOSVendorB\x08\xbaH\x05\x82\x01\x02\x10\x01H\x00R\x06vendor\x88\x01\x01\x12*\n\x07version\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01H\x01R\x07version\x88\x01\x01\x42\t\n\x07_vendorB\n\n\x08_version\"\x98\x01\n\nSwitchSync\x12.\n\x04time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x04time\x12\x35\n\x08\x64uration\x18\x02 \x01(\x0b\x32\x19.google.protobuf.DurationR\x08\x64uration\x12\x19\n\x05\x65rror\x18\x03 \x01(\tH\x00R\x05\x65rror\x88\x01\x01\x42\x08\n\x06_error\"\xa1\x01\n\x12SwitchWithMachines\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x1c\n\tpartition\x18\x02 \x01(\tR\tpartition\x12\x12\n\x04rack\x18\x03 \x01(\tR\x04rack\x12I\n\x0b\x63onnections\x18\x04 \x03(\x0b\x32\'.metalstack.api.v2.SwitchNicWithMachineR\x0b\x63onnections\"\xad\x01\n\x14SwitchNicWithMachine\x12.\n\x03nic\x18\x01 \x01(\x0b\x32\x1c.metalstack.api.v2.SwitchNicR\x03nic\x12\x34\n\x07machine\x18\x02 \x01(\x0b\x32\x1a.metalstack.api.v2.MachineR\x07machine\x12/\n\x03\x66ru\x18\x03 \x01(\x0b\x32\x1d.metalstack.api.v2.MachineFRUR\x03\x66ru*\x89\x02\n\x08\x42GPState\x12\x19\n\x15\x42GP_STATE_UNSPECIFIED\x10\x00\x12\x1c\n\x0e\x42GP_STATE_IDLE\x10\x01\x1a\x08\x82\xb2\x19\x04Idle\x12\"\n\x11\x42GP_STATE_CONNECT\x10\x02\x1a\x0b\x82\xb2\x19\x07\x43onnect\x12 \n\x10\x42GP_STATE_ACTIVE\x10\x03\x1a\n\x82\xb2\x19\x06\x41\x63tive\x12%\n\x13\x42GP_STATE_OPEN_SENT\x10\x04\x1a\x0c\x82\xb2\x19\x08OpenSent\x12+\n\x16\x42GP_STATE_OPEN_CONFIRM\x10\x05\x1a\x0f\x82\xb2\x19\x0bOpenConfirm\x12*\n\x15\x42GP_STATE_ESTABLISHED\x10\x06\x1a\x0f\x82\xb2\x19\x0b\x45stablished*\xa2\x01\n\x11SwitchReplaceMode\x12)\n\x1fSWITCH_REPLACE_MODE_UNSPECIFIED\x10\x00\x1a\x04\x82\xb2\x19\x00\x12,\n\x1bSWITCH_REPLACE_MODE_REPLACE\x10\x01\x1a\x0b\x82\xb2\x19\x07replace\x12\x34\n\x1fSWITCH_REPLACE_MODE_OPERATIONAL\x10\x02\x1a\x0f\x82\xb2\x19\x0boperational*\x84\x01\n\x0eSwitchOSVendor\x12 \n\x1cSWITCH_OS_VENDOR_UNSPECIFIED\x10\x00\x12)\n\x18SWITCH_OS_VENDOR_CUMULUS\x10\x01\x1a\x0b\x82\xb2\x19\x07\x43umulus\x12%\n\x16SWITCH_OS_VENDOR_SONIC\x10\x02\x1a\t\x82\xb2\x19\x05SONiC*\xad\x01\n\x10SwitchPortStatus\x12\"\n\x1eSWITCH_PORT_STATUS_UNSPECIFIED\x10\x00\x12!\n\x15SWITCH_PORT_STATUS_UP\x10\x01\x1a\x06\x82\xb2\x19\x02up\x12%\n\x17SWITCH_PORT_STATUS_DOWN\x10\x02\x1a\x08\x82\xb2\x19\x04\x64own\x12+\n\x1aSWITCH_PORT_STATUS_UNKNOWN\x10\x03\x1a\x0b\x82\xb2\x19\x07unknownB\xc1\x01\n\x15\x63om.metalstack.api.v2B\x0bSwitchProtoP\x01Z5github.com/metal-stack/api/go/metalstack/api/v2;apiv2\xa2\x02\x03MAX\xaa\x02\x11Metalstack.Api.V2\xca\x02\x11Metalstack\\Api\\V2\xe2\x02\x1dMetalstack\\Api\\V2\\GPBMetadata\xea\x02\x13Metalstack::Api::V2b\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emetalstack/api/v2/switch.proto\x12\x11metalstack.api.v2\x1a\x1b\x62uf/validate/validate.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1emetalstack/api/v2/common.proto\x1a\x1fmetalstack/api/v2/machine.proto\x1a(metalstack/api/v2/predefined_rules.proto\"\xe2\x06\n\x06Switch\x12\x1d\n\x02id\x18\x01 \x01(\tB\r\xbaH\nr\x08h\x01\xc0\xb3\xae\xb1\x02\x01R\x02id\x12+\n\x04meta\x18\x02 \x01(\x0b\x32\x17.metalstack.api.v2.MetaR\x04meta\x12-\n\x0b\x64\x65scription\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc8\xb3\xae\xb1\x02\x01R\x0b\x64\x65scription\x12$\n\x04rack\x18\x04 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01H\x00R\x04rack\x88\x01\x01\x12$\n\x04room\x18\x05 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01H\x01R\x04room\x88\x01\x01\x12)\n\tpartition\x18\x06 \x01(\tB\x0b\xbaH\x08r\x06\xd0\xb3\xae\xb1\x02\x01R\tpartition\x12Q\n\x0creplace_mode\x18\x07 \x01(\x0e\x32$.metalstack.api.v2.SwitchReplaceModeB\x08\xbaH\x05\x82\x01\x02\x10\x01R\x0breplaceMode\x12,\n\rmanagement_ip\x18\x08 \x01(\tB\x07\xbaH\x04r\x02p\x01R\x0cmanagementIp\x12\x38\n\x0fmanagement_user\x18\t \x01(\tB\n\xbaH\x07r\x05\x10\x02\x18\x80\x01H\x02R\x0emanagementUser\x88\x01\x01\x12\x38\n\x0f\x63onsole_command\x18\n \x01(\tB\n\xbaH\x07r\x05\x10\x02\x18\x80\x01H\x03R\x0e\x63onsoleCommand\x88\x01\x01\x12\x30\n\x04nics\x18\x0b \x03(\x0b\x32\x1c.metalstack.api.v2.SwitchNicR\x04nics\x12+\n\x02os\x18\x0c \x01(\x0b\x32\x1b.metalstack.api.v2.SwitchOSR\x02os\x12U\n\x13machine_connections\x18\r \x03(\x0b\x32$.metalstack.api.v2.MachineConnectionR\x12machineConnections\x12:\n\tlast_sync\x18\x0e \x01(\x0b\x32\x1d.metalstack.api.v2.SwitchSyncR\x08lastSync\x12\x45\n\x0flast_sync_error\x18\x0f \x01(\x0b\x32\x1d.metalstack.api.v2.SwitchSyncR\rlastSyncErrorB\x07\n\x05_rackB\x07\n\x05_roomB\x12\n\x10_management_userB\x12\n\x10_console_command\"\xb1\x01\n\x08SwitchOS\x12\x43\n\x06vendor\x18\x01 \x01(\x0e\x32!.metalstack.api.v2.SwitchOSVendorB\x08\xbaH\x05\x82\x01\x02\x10\x01R\x06vendor\x12%\n\x07version\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x07version\x12\x39\n\x12metal_core_version\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x10metalCoreVersion\"\xf2\x03\n\tSwitchNic\x12\x1f\n\x04name\x18\x01 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x04name\x12+\n\nidentifier\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\nidentifier\x12\"\n\x03mac\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xb8\xb3\xae\xb1\x02\x01H\x00R\x03mac\x88\x01\x01\x12\"\n\x03vrf\x18\x04 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01H\x01R\x03vrf\x88\x01\x01\x12\x36\n\x05state\x18\x05 \x01(\x0b\x32\x1b.metalstack.api.v2.NicStateH\x02R\x05state\x88\x01\x01\x12@\n\nbgp_filter\x18\x06 \x01(\x0b\x32\x1c.metalstack.api.v2.BGPFilterH\x03R\tbgpFilter\x88\x01\x01\x12P\n\x0e\x62gp_port_state\x18\x07 \x01(\x0b\x32%.metalstack.api.v2.SwitchBGPPortStateH\x04R\x0c\x62gpPortState\x88\x01\x01\x12G\n\nmembership\x18\x08 \x01(\x0e\x32\'.metalstack.api.v2.SwitchPortMembershipR\nmembershipB\x06\n\x04_macB\x06\n\x04_vrfB\x08\n\x06_stateB\r\n\x0b_bgp_filterB\x11\n\x0f_bgp_port_state\"T\n\tBGPFilter\x12\"\n\x05\x63idrs\x18\x01 \x03(\tB\x0c\xbaH\t\x92\x01\x06\xb8\xa4\xb3\xb1\x02\x01R\x05\x63idrs\x12#\n\x04vnis\x18\x02 \x03(\tB\x0f\xbaH\x0c\x92\x01\t\"\x07r\x05\x10\x02\x18\x80\x01R\x04vnis\"\x92\x03\n\x12SwitchBGPPortState\x12\'\n\x08neighbor\x18\x01 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x08neighbor\x12*\n\npeer_group\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\tpeerGroup\x12&\n\x08vrf_name\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01R\x07vrfName\x12\x42\n\tbgp_state\x18\x04 \x01(\x0e\x32\x1b.metalstack.api.v2.BGPStateB\x08\xbaH\x05\x82\x01\x02\x10\x01R\x08\x62gpState\x12S\n\x18\x62gp_timer_up_established\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x15\x62gpTimerUpEstablished\x12.\n\x13sent_prefix_counter\x18\x06 \x01(\x04R\x11sentPrefixCounter\x12\x36\n\x17\x61\x63\x63\x65pted_prefix_counter\x18\x07 \x01(\x04R\x15\x61\x63\x63\x65ptedPrefixCounter\"\xab\x01\n\x08NicState\x12L\n\x07\x64\x65sired\x18\x01 \x01(\x0e\x32#.metalstack.api.v2.SwitchPortStatusB\x08\xbaH\x05\x82\x01\x02\x10\x01H\x00R\x07\x64\x65sired\x88\x01\x01\x12\x45\n\x06\x61\x63tual\x18\x02 \x01(\x0e\x32#.metalstack.api.v2.SwitchPortStatusB\x08\xbaH\x05\x82\x01\x02\x10\x01R\x06\x61\x63tualB\n\n\x08_desired\"b\n\x11MachineConnection\x12\x1d\n\nmachine_id\x18\x01 \x01(\tR\tmachineId\x12.\n\x03nic\x18\x02 \x01(\x0b\x32\x1c.metalstack.api.v2.SwitchNicR\x03nic\"\xec\x02\n\x0bSwitchQuery\x12\"\n\x02id\x18\x01 \x01(\tB\r\xbaH\nr\x08h\x01\xc0\xb3\xae\xb1\x02\x01H\x00R\x02id\x88\x01\x01\x12.\n\tpartition\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xd0\xb3\xae\xb1\x02\x01H\x01R\tpartition\x88\x01\x01\x12$\n\x04rack\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01H\x02R\x04rack\x88\x01\x01\x12$\n\x04room\x18\x04 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01H\x03R\x04room\x88\x01\x01\x12\x35\n\x02os\x18\x05 \x01(\x0b\x32 .metalstack.api.v2.SwitchOSQueryH\x04R\x02os\x88\x01\x01\x12?\n\x14\x63onnected_machine_id\x18\x06 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01H\x05R\x12\x63onnectedMachineId\x88\x01\x01\x42\x05\n\x03_idB\x0c\n\n_partitionB\x07\n\x05_rackB\x07\n\x05_roomB\x05\n\x03_osB\x17\n\x15_connected_machine_id\"\x9c\x01\n\rSwitchOSQuery\x12H\n\x06vendor\x18\x01 \x01(\x0e\x32!.metalstack.api.v2.SwitchOSVendorB\x08\xbaH\x05\x82\x01\x02\x10\x01H\x00R\x06vendor\x88\x01\x01\x12*\n\x07version\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xc0\xb3\xae\xb1\x02\x01H\x01R\x07version\x88\x01\x01\x42\t\n\x07_vendorB\n\n\x08_version\"\x98\x01\n\nSwitchSync\x12.\n\x04time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x04time\x12\x35\n\x08\x64uration\x18\x02 \x01(\x0b\x32\x19.google.protobuf.DurationR\x08\x64uration\x12\x19\n\x05\x65rror\x18\x03 \x01(\tH\x00R\x05\x65rror\x88\x01\x01\x42\x08\n\x06_error\"\xa1\x01\n\x12SwitchWithMachines\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x1c\n\tpartition\x18\x02 \x01(\tR\tpartition\x12\x12\n\x04rack\x18\x03 \x01(\tR\x04rack\x12I\n\x0b\x63onnections\x18\x04 \x03(\x0b\x32\'.metalstack.api.v2.SwitchNicWithMachineR\x0b\x63onnections\"\xad\x01\n\x14SwitchNicWithMachine\x12.\n\x03nic\x18\x01 \x01(\x0b\x32\x1c.metalstack.api.v2.SwitchNicR\x03nic\x12\x34\n\x07machine\x18\x02 \x01(\x0b\x32\x1a.metalstack.api.v2.MachineR\x07machine\x12/\n\x03\x66ru\x18\x03 \x01(\x0b\x32\x1d.metalstack.api.v2.MachineFRUR\x03\x66ru*\x89\x02\n\x08\x42GPState\x12\x19\n\x15\x42GP_STATE_UNSPECIFIED\x10\x00\x12\x1c\n\x0e\x42GP_STATE_IDLE\x10\x01\x1a\x08\x82\xb2\x19\x04Idle\x12\"\n\x11\x42GP_STATE_CONNECT\x10\x02\x1a\x0b\x82\xb2\x19\x07\x43onnect\x12 \n\x10\x42GP_STATE_ACTIVE\x10\x03\x1a\n\x82\xb2\x19\x06\x41\x63tive\x12%\n\x13\x42GP_STATE_OPEN_SENT\x10\x04\x1a\x0c\x82\xb2\x19\x08OpenSent\x12+\n\x16\x42GP_STATE_OPEN_CONFIRM\x10\x05\x1a\x0f\x82\xb2\x19\x0bOpenConfirm\x12*\n\x15\x42GP_STATE_ESTABLISHED\x10\x06\x1a\x0f\x82\xb2\x19\x0b\x45stablished*\xa2\x01\n\x11SwitchReplaceMode\x12)\n\x1fSWITCH_REPLACE_MODE_UNSPECIFIED\x10\x00\x1a\x04\x82\xb2\x19\x00\x12,\n\x1bSWITCH_REPLACE_MODE_REPLACE\x10\x01\x1a\x0b\x82\xb2\x19\x07replace\x12\x34\n\x1fSWITCH_REPLACE_MODE_OPERATIONAL\x10\x02\x1a\x0f\x82\xb2\x19\x0boperational*\x84\x01\n\x0eSwitchOSVendor\x12 \n\x1cSWITCH_OS_VENDOR_UNSPECIFIED\x10\x00\x12)\n\x18SWITCH_OS_VENDOR_CUMULUS\x10\x01\x1a\x0b\x82\xb2\x19\x07\x43umulus\x12%\n\x16SWITCH_OS_VENDOR_SONIC\x10\x02\x1a\t\x82\xb2\x19\x05SONiC*\xad\x01\n\x10SwitchPortStatus\x12\"\n\x1eSWITCH_PORT_STATUS_UNSPECIFIED\x10\x00\x12!\n\x15SWITCH_PORT_STATUS_UP\x10\x01\x1a\x06\x82\xb2\x19\x02up\x12%\n\x17SWITCH_PORT_STATUS_DOWN\x10\x02\x1a\x08\x82\xb2\x19\x04\x64own\x12+\n\x1aSWITCH_PORT_STATUS_UNKNOWN\x10\x03\x1a\x0b\x82\xb2\x19\x07unknown*\xd9\x01\n\x14SwitchPortMembership\x12&\n\"SWITCH_PORT_MEMBERSHIP_UNSPECIFIED\x10\x00\x12\x33\n SWITCH_PORT_MEMBERSHIP_UNMANAGED\x10\x01\x1a\r\x82\xb2\x19\tunmanaged\x12\x31\n\x1fSWITCH_PORT_MEMBERSHIP_INTERNAL\x10\x02\x1a\x0c\x82\xb2\x19\x08internal\x12\x31\n\x1fSWITCH_PORT_MEMBERSHIP_EXTERNAL\x10\x03\x1a\x0c\x82\xb2\x19\x08\x65xternalB\xc1\x01\n\x15\x63om.metalstack.api.v2B\x0bSwitchProtoP\x01Z5github.com/metal-stack/api/go/metalstack/api/v2;apiv2\xa2\x02\x03MAX\xaa\x02\x11Metalstack.Api.V2\xca\x02\x11Metalstack\\Api\\V2\xe2\x02\x1dMetalstack\\Api\\V2\\GPBMetadata\xea\x02\x13Metalstack::Api::V2b\x06proto3')
_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -66,6 +66,12 @@
_globals['_SWITCHPORTSTATUS'].values_by_name["SWITCH_PORT_STATUS_DOWN"]._serialized_options = b'\202\262\031\004down'
_globals['_SWITCHPORTSTATUS'].values_by_name["SWITCH_PORT_STATUS_UNKNOWN"]._loaded_options = None
_globals['_SWITCHPORTSTATUS'].values_by_name["SWITCH_PORT_STATUS_UNKNOWN"]._serialized_options = b'\202\262\031\007unknown'
+ _globals['_SWITCHPORTMEMBERSHIP'].values_by_name["SWITCH_PORT_MEMBERSHIP_UNMANAGED"]._loaded_options = None
+ _globals['_SWITCHPORTMEMBERSHIP'].values_by_name["SWITCH_PORT_MEMBERSHIP_UNMANAGED"]._serialized_options = b'\202\262\031\tunmanaged'
+ _globals['_SWITCHPORTMEMBERSHIP'].values_by_name["SWITCH_PORT_MEMBERSHIP_INTERNAL"]._loaded_options = None
+ _globals['_SWITCHPORTMEMBERSHIP'].values_by_name["SWITCH_PORT_MEMBERSHIP_INTERNAL"]._serialized_options = b'\202\262\031\010internal'
+ _globals['_SWITCHPORTMEMBERSHIP'].values_by_name["SWITCH_PORT_MEMBERSHIP_EXTERNAL"]._loaded_options = None
+ _globals['_SWITCHPORTMEMBERSHIP'].values_by_name["SWITCH_PORT_MEMBERSHIP_EXTERNAL"]._serialized_options = b'\202\262\031\010external'
_globals['_SWITCH'].fields_by_name['id']._loaded_options = None
_globals['_SWITCH'].fields_by_name['id']._serialized_options = b'\272H\nr\010h\001\300\263\256\261\002\001'
_globals['_SWITCH'].fields_by_name['description']._loaded_options = None
@@ -128,36 +134,38 @@
_globals['_SWITCHOSQUERY'].fields_by_name['vendor']._serialized_options = b'\272H\005\202\001\002\020\001'
_globals['_SWITCHOSQUERY'].fields_by_name['version']._loaded_options = None
_globals['_SWITCHOSQUERY'].fields_by_name['version']._serialized_options = b'\272H\010r\006\300\263\256\261\002\001'
- _globals['_BGPSTATE']._serialized_start=3518
- _globals['_BGPSTATE']._serialized_end=3783
- _globals['_SWITCHREPLACEMODE']._serialized_start=3786
- _globals['_SWITCHREPLACEMODE']._serialized_end=3948
- _globals['_SWITCHOSVENDOR']._serialized_start=3951
- _globals['_SWITCHOSVENDOR']._serialized_end=4083
- _globals['_SWITCHPORTSTATUS']._serialized_start=4086
- _globals['_SWITCHPORTSTATUS']._serialized_end=4259
+ _globals['_BGPSTATE']._serialized_start=3591
+ _globals['_BGPSTATE']._serialized_end=3856
+ _globals['_SWITCHREPLACEMODE']._serialized_start=3859
+ _globals['_SWITCHREPLACEMODE']._serialized_end=4021
+ _globals['_SWITCHOSVENDOR']._serialized_start=4024
+ _globals['_SWITCHOSVENDOR']._serialized_end=4156
+ _globals['_SWITCHPORTSTATUS']._serialized_start=4159
+ _globals['_SWITCHPORTSTATUS']._serialized_end=4332
+ _globals['_SWITCHPORTMEMBERSHIP']._serialized_start=4335
+ _globals['_SWITCHPORTMEMBERSHIP']._serialized_end=4552
_globals['_SWITCH']._serialized_start=255
_globals['_SWITCH']._serialized_end=1121
_globals['_SWITCHOS']._serialized_start=1124
_globals['_SWITCHOS']._serialized_end=1301
_globals['_SWITCHNIC']._serialized_start=1304
- _globals['_SWITCHNIC']._serialized_end=1729
- _globals['_BGPFILTER']._serialized_start=1731
- _globals['_BGPFILTER']._serialized_end=1815
- _globals['_SWITCHBGPPORTSTATE']._serialized_start=1818
- _globals['_SWITCHBGPPORTSTATE']._serialized_end=2220
- _globals['_NICSTATE']._serialized_start=2223
- _globals['_NICSTATE']._serialized_end=2394
- _globals['_MACHINECONNECTION']._serialized_start=2396
- _globals['_MACHINECONNECTION']._serialized_end=2494
- _globals['_SWITCHQUERY']._serialized_start=2497
- _globals['_SWITCHQUERY']._serialized_end=2861
- _globals['_SWITCHOSQUERY']._serialized_start=2864
- _globals['_SWITCHOSQUERY']._serialized_end=3020
- _globals['_SWITCHSYNC']._serialized_start=3023
- _globals['_SWITCHSYNC']._serialized_end=3175
- _globals['_SWITCHWITHMACHINES']._serialized_start=3178
- _globals['_SWITCHWITHMACHINES']._serialized_end=3339
- _globals['_SWITCHNICWITHMACHINE']._serialized_start=3342
- _globals['_SWITCHNICWITHMACHINE']._serialized_end=3515
+ _globals['_SWITCHNIC']._serialized_end=1802
+ _globals['_BGPFILTER']._serialized_start=1804
+ _globals['_BGPFILTER']._serialized_end=1888
+ _globals['_SWITCHBGPPORTSTATE']._serialized_start=1891
+ _globals['_SWITCHBGPPORTSTATE']._serialized_end=2293
+ _globals['_NICSTATE']._serialized_start=2296
+ _globals['_NICSTATE']._serialized_end=2467
+ _globals['_MACHINECONNECTION']._serialized_start=2469
+ _globals['_MACHINECONNECTION']._serialized_end=2567
+ _globals['_SWITCHQUERY']._serialized_start=2570
+ _globals['_SWITCHQUERY']._serialized_end=2934
+ _globals['_SWITCHOSQUERY']._serialized_start=2937
+ _globals['_SWITCHOSQUERY']._serialized_end=3093
+ _globals['_SWITCHSYNC']._serialized_start=3096
+ _globals['_SWITCHSYNC']._serialized_end=3248
+ _globals['_SWITCHWITHMACHINES']._serialized_start=3251
+ _globals['_SWITCHWITHMACHINES']._serialized_end=3412
+ _globals['_SWITCHNICWITHMACHINE']._serialized_start=3415
+ _globals['_SWITCHNICWITHMACHINE']._serialized_end=3588
# @@protoc_insertion_point(module_scope)
diff --git a/python/metalstack/api/v2/switch_pb2.pyi b/python/metalstack/api/v2/switch_pb2.pyi
index 01b86fcb..7c707335 100644
--- a/python/metalstack/api/v2/switch_pb2.pyi
+++ b/python/metalstack/api/v2/switch_pb2.pyi
@@ -43,6 +43,13 @@ class SwitchPortStatus(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
SWITCH_PORT_STATUS_UP: _ClassVar[SwitchPortStatus]
SWITCH_PORT_STATUS_DOWN: _ClassVar[SwitchPortStatus]
SWITCH_PORT_STATUS_UNKNOWN: _ClassVar[SwitchPortStatus]
+
+class SwitchPortMembership(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
+ __slots__ = ()
+ SWITCH_PORT_MEMBERSHIP_UNSPECIFIED: _ClassVar[SwitchPortMembership]
+ SWITCH_PORT_MEMBERSHIP_UNMANAGED: _ClassVar[SwitchPortMembership]
+ SWITCH_PORT_MEMBERSHIP_INTERNAL: _ClassVar[SwitchPortMembership]
+ SWITCH_PORT_MEMBERSHIP_EXTERNAL: _ClassVar[SwitchPortMembership]
BGP_STATE_UNSPECIFIED: BGPState
BGP_STATE_IDLE: BGPState
BGP_STATE_CONNECT: BGPState
@@ -60,6 +67,10 @@ SWITCH_PORT_STATUS_UNSPECIFIED: SwitchPortStatus
SWITCH_PORT_STATUS_UP: SwitchPortStatus
SWITCH_PORT_STATUS_DOWN: SwitchPortStatus
SWITCH_PORT_STATUS_UNKNOWN: SwitchPortStatus
+SWITCH_PORT_MEMBERSHIP_UNSPECIFIED: SwitchPortMembership
+SWITCH_PORT_MEMBERSHIP_UNMANAGED: SwitchPortMembership
+SWITCH_PORT_MEMBERSHIP_INTERNAL: SwitchPortMembership
+SWITCH_PORT_MEMBERSHIP_EXTERNAL: SwitchPortMembership
class Switch(_message.Message):
__slots__ = ("id", "meta", "description", "rack", "room", "partition", "replace_mode", "management_ip", "management_user", "console_command", "nics", "os", "machine_connections", "last_sync", "last_sync_error")
@@ -106,7 +117,7 @@ class SwitchOS(_message.Message):
def __init__(self, vendor: _Optional[_Union[SwitchOSVendor, str]] = ..., version: _Optional[str] = ..., metal_core_version: _Optional[str] = ...) -> None: ...
class SwitchNic(_message.Message):
- __slots__ = ("name", "identifier", "mac", "vrf", "state", "bgp_filter", "bgp_port_state")
+ __slots__ = ("name", "identifier", "mac", "vrf", "state", "bgp_filter", "bgp_port_state", "membership")
NAME_FIELD_NUMBER: _ClassVar[int]
IDENTIFIER_FIELD_NUMBER: _ClassVar[int]
MAC_FIELD_NUMBER: _ClassVar[int]
@@ -114,6 +125,7 @@ class SwitchNic(_message.Message):
STATE_FIELD_NUMBER: _ClassVar[int]
BGP_FILTER_FIELD_NUMBER: _ClassVar[int]
BGP_PORT_STATE_FIELD_NUMBER: _ClassVar[int]
+ MEMBERSHIP_FIELD_NUMBER: _ClassVar[int]
name: str
identifier: str
mac: str
@@ -121,7 +133,8 @@ class SwitchNic(_message.Message):
state: NicState
bgp_filter: BGPFilter
bgp_port_state: SwitchBGPPortState
- def __init__(self, name: _Optional[str] = ..., identifier: _Optional[str] = ..., mac: _Optional[str] = ..., vrf: _Optional[str] = ..., state: _Optional[_Union[NicState, _Mapping]] = ..., bgp_filter: _Optional[_Union[BGPFilter, _Mapping]] = ..., bgp_port_state: _Optional[_Union[SwitchBGPPortState, _Mapping]] = ...) -> None: ...
+ membership: SwitchPortMembership
+ def __init__(self, name: _Optional[str] = ..., identifier: _Optional[str] = ..., mac: _Optional[str] = ..., vrf: _Optional[str] = ..., state: _Optional[_Union[NicState, _Mapping]] = ..., bgp_filter: _Optional[_Union[BGPFilter, _Mapping]] = ..., bgp_port_state: _Optional[_Union[SwitchBGPPortState, _Mapping]] = ..., membership: _Optional[_Union[SwitchPortMembership, str]] = ...) -> None: ...
class BGPFilter(_message.Message):
__slots__ = ("cidrs", "vnis")