rework protobuf messages
Some checks failed
/ build_macos (push) Has been cancelled
/ build_windows (push) Has been cancelled
/ build_ubuntu (push) Has been cancelled

PubSub allows us to do schema validation, however it only allows one top level message at a time.  Move other sub-message declarations under the main message declaration so that we can enable schema validation in the pubsub stream directly
This commit is contained in:
Grant Limberg 2025-08-25 15:09:10 -07:00
parent 2833d0e4f4
commit f8a4a5d6af
7 changed files with 100 additions and 97 deletions

View file

@ -12,7 +12,6 @@ fn main() {
.type_attribute(".", "#[derive(serde::Serialize, serde::Deserialize)]") .type_attribute(".", "#[derive(serde::Serialize, serde::Deserialize)]")
.compile_protos( .compile_protos(
&[ &[
"src/pubsub/metadata.proto",
"src/pubsub/network.proto", "src/pubsub/network.proto",
"src/pubsub/member.proto", "src/pubsub/member.proto",
"src/pubsub/member_status.proto", "src/pubsub/member_status.proto",

View file

@ -1,10 +1,9 @@
syntax = "proto3"; syntax = "proto3";
import "metadata.proto";
package pbmessages; package pbmessages;
message Member { message MemberChange {
message Member {
string device_id = 1; string device_id = 1;
string network_id = 2; string network_id = 2;
string identity = 3; // Identity of the member string identity = 3; // Identity of the member
@ -28,10 +27,13 @@ message Member {
optional string remote_trace_target = 21; // Remote trace target optional string remote_trace_target = 21; // Remote trace target
bool sso_exepmt = 22; // Whether SSO is exempt bool sso_exepmt = 22; // Whether SSO is exempt
uint64 auth_expiry_time = 23; // Authorization expiry time in milliseconds uint64 auth_expiry_time = 23; // Authorization expiry time in milliseconds
} }
message MemberChangeMetadata {
string trace_id = 1;
string controller_id = 2;
}
message MemberChange {
optional Member old = 1; optional Member old = 1;
optional Member new = 2; optional Member new = 2;
optional Metadata metadata = 3; optional MemberChangeMetadata metadata = 3;
} }

View file

@ -87,7 +87,8 @@ impl MemberListener {
mod tests { mod tests {
use super::*; use super::*;
use crate::pubsub::change_listener::tests::setup_pubsub_emulator; use crate::pubsub::change_listener::tests::setup_pubsub_emulator;
use crate::pubsub::protobuf::pbmessages::{Member, MemberChange}; use crate::pubsub::protobuf::pbmessages::member_change::Member;
use crate::pubsub::protobuf::pbmessages::MemberChange;
use gcloud_googleapis::pubsub::v1::PubsubMessage; use gcloud_googleapis::pubsub::v1::PubsubMessage;
use gcloud_pubsub::client::{Client, ClientConfig}; use gcloud_pubsub::client::{Client, ClientConfig};

View file

@ -2,10 +2,15 @@ syntax = "proto3";
package pbmessages; package pbmessages;
import "metadata.proto";
message MemberStatus { message MemberStatus {
Metadata metadata = 1; message MemberStatusMetadata {
string trace_id = 1;
string controller_id = 2;
}
MemberStatusMetadata metadata = 1;
string network_id = 2; string network_id = 2;
string member_id = 3; string member_id = 3;
uint64 timestamp = 4; // Unix timestamp in milliseconds uint64 timestamp = 4; // Unix timestamp in milliseconds

View file

@ -1,8 +0,0 @@
syntax = "proto3";
package pbmessages;
message Metadata {
string trace_id = 1;
string controller_id = 2;
}

View file

@ -1,35 +1,39 @@
syntax = "proto3"; syntax = "proto3";
import "metadata.proto";
package pbmessages; package pbmessages;
message IPRange { message NetworkChange {
message NetworkChangeMetadata {
string trace_id = 1;
string controller_id = 2;
}
message IPRange {
string start_ip = 1; // Start of the IP range string start_ip = 1; // Start of the IP range
string end_ip = 2; // End of the IP range string end_ip = 2; // End of the IP range
} }
message Route { message Route {
string target = 1; // Target IP or network string target = 1; // Target IP or network
optional string via = 2; // Optional next hop IP optional string via = 2; // Optional next hop IP
} }
message DNS { message DNS {
string domain = 1; // Search domain string domain = 1; // Search domain
repeated string nameservers = 2; // List of nameservers repeated string nameservers = 2; // List of nameservers
} }
message IPV4AssignMode { message IPV4AssignMode {
bool zt = 1; // Whether ZeroTier is used for IPv4 assignment bool zt = 1; // Whether ZeroTier is used for IPv4 assignment
} }
message IPv6AssignMode { message IPv6AssignMode {
bool six_plane = 1; // Whether 6plane is used for IPv6 assignment bool six_plane = 1; // Whether 6plane is used for IPv6 assignment
bool rfc4193 = 2; // Whether RFC 4193 is used for IPv6 assignment bool rfc4193 = 2; // Whether RFC 4193 is used for IPv6 assignment
bool zt = 3; // Whether ZeroTier is used for IPv6 assignment bool zt = 3; // Whether ZeroTier is used for IPv6 assignment
} }
message Network { message Network {
string network_id = 1; string network_id = 1;
string capabilities = 2; // JSON string of capabilities string capabilities = 2; // JSON string of capabilities
uint64 creation_time = 3; // Unix timestamp in milliseconds uint64 creation_time = 3; // Unix timestamp in milliseconds
@ -53,10 +57,9 @@ message Network {
optional string sso_authorization_endpoint = 21; // SSO authorization endpoint optional string sso_authorization_endpoint = 21; // SSO authorization endpoint
optional string sso_issuer = 22; // SSO issuer optional string sso_issuer = 22; // SSO issuer
optional string sso_provider = 23; // SSO provider optional string sso_provider = 23; // SSO provider
} }
message NetworkChange {
optional Network old = 1; optional Network old = 1;
optional Network new = 2; optional Network new = 2;
optional Metadata metadata = 3; optional NetworkChangeMetadata metadata = 3;
} }

View file

@ -88,7 +88,8 @@ impl NetworkListener {
mod tests { mod tests {
use super::*; use super::*;
use crate::pubsub::change_listener::tests::setup_pubsub_emulator; use crate::pubsub::change_listener::tests::setup_pubsub_emulator;
use crate::pubsub::protobuf::pbmessages::Network; use crate::pubsub::protobuf::pbmessages::network_change::Network;
use crate::pubsub::protobuf::pbmessages::NetworkChange;
use gcloud_googleapis::pubsub::v1::PubsubMessage; use gcloud_googleapis::pubsub::v1::PubsubMessage;
use gcloud_pubsub::client::{Client, ClientConfig}; use gcloud_pubsub::client::{Client, ClientConfig};