From 53998178c566386bcedfd3e84ae5bb0e2225109a Mon Sep 17 00:00:00 2001 From: Shaun Crampton Date: Wed, 13 Aug 2025 12:43:06 +0100 Subject: [PATCH 1/3] Add Felix prometheus metrics for latency behind Typha - Typha sends a breadcrumb revision message to felix. - Message plumbed through to the dataplane. - Dataplane updates a prometheus stat with the latency vs the message. - Annotate typha breadcrumb stats with server ID to allow comparison with Felix. --- felix/calc/calc_graph.go | 2 + felix/calc/dataplane_passthru.go | 10 + felix/calc/event_sequencer.go | 42 +++ felix/calc/profile_decoder_test.go | 8 + felix/daemon/daemon.go | 52 +-- felix/dataplane/driver.go | 2 + felix/dataplane/external/ext_dataplane.go | 2 + felix/dataplane/linux/int_dataplane.go | 75 ++++- felix/proto/felixbackend.pb.go | 372 +++++++++++++++------- felix/proto/felixbackend.proto | 14 + go.mod | 2 +- libcalico-go/lib/backend/model/keys.go | 11 + libcalico-go/lib/backend/model/typha.go | 77 +++++ typha/pkg/daemon/daemon.go | 15 + typha/pkg/promutils/registration.go | 11 + typha/pkg/snapcache/cache.go | 113 +++++-- 16 files changed, 636 insertions(+), 172 deletions(-) create mode 100644 libcalico-go/lib/backend/model/typha.go diff --git a/felix/calc/calc_graph.go b/felix/calc/calc_graph.go index ff60db64c19..fe9045da4e9 100644 --- a/felix/calc/calc_graph.go +++ b/felix/calc/calc_graph.go @@ -88,6 +88,8 @@ type passthruCallbacks interface { OnGlobalBGPConfigUpdate(*v3.BGPConfiguration) OnServiceUpdate(*proto.ServiceUpdate) OnServiceRemove(*proto.ServiceRemove) + OnTyphaRevisionRemove() + OnTyphaRevisionUpdate(tr *model.TyphaRevision) } type routeCallbacks interface { diff --git a/felix/calc/dataplane_passthru.go b/felix/calc/dataplane_passthru.go index 13f8c6bd7d7..7c86de24ee2 100644 --- a/felix/calc/dataplane_passthru.go +++ b/felix/calc/dataplane_passthru.go @@ -53,6 +53,7 @@ func (h *DataplanePassthru) RegisterWith(dispatcher *dispatcher.Dispatcher) { dispatcher.Register(model.IPPoolKey{}, h.OnUpdate) dispatcher.Register(model.WireguardKey{}, h.OnUpdate) dispatcher.Register(model.ResourceKey{}, h.OnUpdate) + dispatcher.Register(model.TyphaRevisionKey{}, h.OnUpdate) } func (h *DataplanePassthru) OnUpdate(update api.Update) (filterOut bool) { @@ -95,6 +96,15 @@ func (h *DataplanePassthru) OnUpdate(update api.Update) (filterOut bool) { wg := update.Value.(*model.Wireguard) h.callbacks.OnWireguardUpdate(key.NodeName, wg) } + case model.TyphaRevisionKey: + if update.Value == nil { + log.WithField("update", update).Debug("Passing-through typha revision deletion") + h.callbacks.OnTyphaRevisionRemove() + } else { + log.WithField("update", update).Debug("Passing-through typha revision updatee") + tr := update.Value.(*model.TyphaRevision) + h.callbacks.OnTyphaRevisionUpdate(tr) + } case model.ResourceKey: if key.Kind == v3.KindBGPConfiguration && key.Name == "default" { log.WithField("update", update).Debug("Passing through global BGPConfiguration") diff --git a/felix/calc/event_sequencer.go b/felix/calc/event_sequencer.go index d7bacb84f30..c1524e78e4c 100644 --- a/felix/calc/event_sequencer.go +++ b/felix/calc/event_sequencer.go @@ -19,6 +19,7 @@ import ( v3 "github.com/projectcalico/api/pkg/apis/projectcalico/v3" log "github.com/sirupsen/logrus" + "google.golang.org/protobuf/types/known/timestamppb" "github.com/projectcalico/calico/felix/config" "github.com/projectcalico/calico/felix/ip" @@ -89,6 +90,8 @@ type EventSequencer struct { pendingGlobalBGPConfig *proto.GlobalBGPConfigUpdate pendingServiceUpdates map[serviceID]*proto.ServiceUpdate pendingServiceDeletes set.Set[serviceID] + pendingTyphaRevision *model.TyphaRevision + pendingTyphaRevisionDeletion bool // Sets to record what we've sent downstream. Updated whenever we flush. sentIPSets set.Set[string] @@ -106,6 +109,7 @@ type EventSequencer struct { sentWireguard set.Set[string] sentWireguardV6 set.Set[string] sentServices set.Set[serviceID] + sentTyphaRevision *model.TyphaRevision Callback EventHandler } @@ -913,6 +917,9 @@ func (buf *EventSequencer) Flush() { } buf.flushServices() + + // Must be last! + buf.flushTyphaRevision() } func (buf *EventSequencer) flushRemovedIPSets() { @@ -1214,6 +1221,39 @@ func (buf *EventSequencer) flushServices() { log.Debug("Done flushing Services") } +func (buf *EventSequencer) OnTyphaRevisionRemove() { + buf.pendingTyphaRevision = nil + if buf.sentTyphaRevision != nil { + buf.pendingTyphaRevisionDeletion = true + } +} + +func (buf *EventSequencer) OnTyphaRevisionUpdate(tr *model.TyphaRevision) { + buf.pendingTyphaRevision = tr + buf.pendingTyphaRevisionDeletion = false +} + +func (buf *EventSequencer) flushTyphaRevisionDeletion() { + if buf.pendingTyphaRevisionDeletion { + buf.Callback(&proto.TyphaRevisionRemove{}) + buf.sentTyphaRevision = nil + buf.pendingTyphaRevisionDeletion = false + } +} + +func (buf *EventSequencer) flushTyphaRevision() { + if buf.pendingTyphaRevision == nil { + return + } + buf.Callback(&proto.TyphaRevisionUpdate{ + ServerID: buf.pendingTyphaRevision.ServerID, + Revision: buf.pendingTyphaRevision.Revision, + Timestamp: timestamppb.New(buf.pendingTyphaRevision.Timestamp), + }) + buf.sentTyphaRevision = buf.pendingTyphaRevision + buf.pendingTyphaRevision = nil +} + func cidrToIPPoolID(cidr ip.CIDR) string { return strings.Replace(cidr.String(), "/", "-", 1) } @@ -1301,3 +1341,5 @@ func isVMWorkload(labels uniquelabels.Map) bool { } return false } + +var _ PipelineCallbacks = &EventSequencer{} diff --git a/felix/calc/profile_decoder_test.go b/felix/calc/profile_decoder_test.go index 10a41a45635..8575b4d0169 100644 --- a/felix/calc/profile_decoder_test.go +++ b/felix/calc/profile_decoder_test.go @@ -138,6 +138,14 @@ type passthruCallbackRecorder struct { nsRemoves []types.NamespaceID } +func (p *passthruCallbackRecorder) OnTyphaRevisionRemove() { + Fail("OnTyphaRevisionRemove received") +} + +func (p *passthruCallbackRecorder) OnTyphaRevisionUpdate(tr *model.TyphaRevision) { + Fail("OnTyphaRevisionUpdate received") +} + func (p *passthruCallbackRecorder) OnHostIPUpdate(hostname string, ip *net.IP) { Fail("HostIPUpdate received") } diff --git a/felix/daemon/daemon.go b/felix/daemon/daemon.go index 48e27e51d4e..d2138aa2dc3 100644 --- a/felix/daemon/daemon.go +++ b/felix/daemon/daemon.go @@ -430,6 +430,31 @@ configRetry: debugserver.StartDebugPprofServer(configParams.DebugHost, configParams.DebugPort) } + var typhaConnection *syncclient.SyncerClient + syncerToValidator := dedupebuffer.New() + + if typhaDiscoverer.TyphaEnabled() { + // Use a remote Syncer, via the Typha server. + log.Info("Connecting to Typha.") + typhaConnection = syncclient.New( + typhaDiscoverer, + buildinfo.Version, + configParams.FelixHostname, + fmt.Sprintf("Revision: %s; Build date: %s", + buildinfo.GitRevision, buildinfo.BuildDate), + syncerToValidator, + &syncclient.Options{ + ReadTimeout: configParams.TyphaReadTimeout, + WriteTimeout: configParams.TyphaWriteTimeout, + KeyFile: configParams.TyphaKeyFile, + CertFile: configParams.TyphaCertFile, + CAFile: configParams.TyphaCAFile, + ServerCN: configParams.TyphaCN, + ServerURISAN: configParams.TyphaURISAN, + }, + ) + } + // Start up the dataplane driver. This may be the internal go-based driver or an external // one. var dpDriver dp.DataplaneDriver @@ -449,13 +474,14 @@ configRetry: } dpDriver, dpDriverCmd = dp.StartDataplaneDriver( - configParams.Copy(), // Copy to avoid concurrent access. + configParams.Copy(), healthAggregator, dpStatsCollector, configChangedRestartCallback, fatalErrorCallback, k8sClientSet, lookupsCache, + typhaConnection != nil, ) // Defer reporting ready until we've started the dataplane driver. This @@ -536,30 +562,8 @@ configRetry: // Get a Syncer from the datastore, or a connection to our remote sync daemon, Typha, // which will feed the calculation graph with updates, bringing Felix into sync. var syncer Startable - var typhaConnection *syncclient.SyncerClient - syncerToValidator := dedupebuffer.New() - if typhaDiscoverer.TyphaEnabled() { - // Use a remote Syncer, via the Typha server. - log.Info("Connecting to Typha.") - typhaConnection = syncclient.New( - typhaDiscoverer, - buildinfo.Version, - configParams.FelixHostname, - fmt.Sprintf("Revision: %s; Build date: %s", - buildinfo.GitRevision, buildinfo.BuildDate), - syncerToValidator, - &syncclient.Options{ - ReadTimeout: configParams.TyphaReadTimeout, - WriteTimeout: configParams.TyphaWriteTimeout, - KeyFile: configParams.TyphaKeyFile, - CertFile: configParams.TyphaCertFile, - CAFile: configParams.TyphaCAFile, - ServerCN: configParams.TyphaCN, - ServerURISAN: configParams.TyphaURISAN, - }, - ) - } else { + if !typhaDiscoverer.TyphaEnabled() { // Use the syncer locally. syncer = felixsyncer.New(backendClient, datastoreConfig.Spec, syncerToValidator, configParams.IsLeader()) diff --git a/felix/dataplane/driver.go b/felix/dataplane/driver.go index 1df20f0b5c5..7963ac8989a 100644 --- a/felix/dataplane/driver.go +++ b/felix/dataplane/driver.go @@ -65,6 +65,7 @@ func StartDataplaneDriver( fatalErrorCallback func(error), k8sClientSet *kubernetes.Clientset, lc *calc.LookupsCache, + typhaEnabled bool, ) (DataplaneDriver, *exec.Cmd) { if !configParams.IsLeader() { // Return an inactive dataplane, since we're not the leader. @@ -217,6 +218,7 @@ func StartDataplaneDriver( ResyncInterval: configParams.InterfaceRefreshInterval, NetlinkTimeout: configParams.NetlinkTimeoutSecs, }, + ReportTyphaStats: typhaEnabled, RulesConfig: rules.Config{ FlowLogsEnabled: configParams.FlowLogsEnabled(), NFTables: configParams.NFTablesMode == "Enabled", diff --git a/felix/dataplane/external/ext_dataplane.go b/felix/dataplane/external/ext_dataplane.go index f427cc7ce9c..f9f23c66891 100644 --- a/felix/dataplane/external/ext_dataplane.go +++ b/felix/dataplane/external/ext_dataplane.go @@ -250,6 +250,8 @@ func WrapPayloadWithEnvelope(msg interface{}, seqNo uint64) (*proto.ToDataplane, envelope.Payload = &proto.ToDataplane_ServiceUpdate{ServiceUpdate: msg} case *proto.ServiceRemove: envelope.Payload = &proto.ToDataplane_ServiceRemove{ServiceRemove: msg} + case *proto.TyphaRevisionUpdate: + envelope.Payload = &proto.ToDataplane_TyphaRevisionUpdate{TyphaRevisionUpdate: msg} default: return nil, fmt.Errorf("unknown message type: %T", msg) diff --git a/felix/dataplane/linux/int_dataplane.go b/felix/dataplane/linux/int_dataplane.go index 0e64989716a..a0a4333b411 100644 --- a/felix/dataplane/linux/int_dataplane.go +++ b/felix/dataplane/linux/int_dataplane.go @@ -135,6 +135,15 @@ var ( Help: "Number of interface address messages processed in each batch. Higher " + "values indicate we're doing more batching to try to keep up.", }) + gaugeLastAppliedTyphaTimestamp = prometheus.NewGaugeVec(prometheus.GaugeOpts{ + Name: "felix_int_dataplane_last_typha_timestamp_seconds", + Help: "Timestamp of the last Typha revision update that was applied to the dataplane.", + }, []string{"server_id"}) + summaryTyphaBatchLatency = cprometheus.NewSummary(prometheus.SummaryOpts{ + Name: "felix_int_dataplane_typha_batch_latency_seconds", + Help: "Latency between Typha receiving events from the datastore (and producing an " + + "update batch) and completion of dataplane update.", + }) processStartTime time.Time zeroKey = wgtypes.Key{} @@ -150,9 +159,20 @@ func init() { prometheus.MustRegister(summaryBatchSize) prometheus.MustRegister(summaryIfaceBatchSize) prometheus.MustRegister(summaryAddrBatchSize) + prometheus.MustRegister(gaugeLastAppliedTyphaTimestamp) + prometheus.MustRegister(summaryTyphaBatchLatency) processStartTime = time.Now() } +var registerTyphaStatsOnce sync.Once + +func ensureTyphaStatsRegistered() { + registerTyphaStatsOnce.Do(func() { + prometheus.MustRegister(gaugeLastAppliedTyphaTimestamp) + prometheus.MustRegister(summaryTyphaBatchLatency) + }) +} + type Config struct { Hostname string NodeZone string @@ -162,6 +182,7 @@ type Config struct { VXLANMTU int VXLANMTUV6 int VXLANPort int + ReportTyphaStats bool MaxIPSetSize int @@ -411,6 +432,10 @@ type InternalDataplane struct { actions generictables.ActionFactory newMatch func() generictables.MatchCriteria + + lastTyphaRevisionUpdate *proto.TyphaRevisionUpdate + typhaRevisionUpdatePending bool + lastReportedTyphaServerID string } const ( @@ -481,6 +506,10 @@ func NewIntDataplaneDriver(config Config) *InternalDataplane { actions: actionSet, newMatch: newMatchFn, } + if config.ReportTyphaStats { + log.Info("Using Typha, registering stats.") + ensureTyphaStatsRegistered() + } dp.applyThrottle.Refill() // Allow the first apply() immediately. dp.ifaceMonitor.StateCallback = dp.onIfaceStateChange dp.ifaceMonitor.AddrCallback = dp.onIfaceAddrsChange @@ -2294,6 +2323,7 @@ func (d *InternalDataplane) loopUpdatingDataplane() { d.sendDataplaneInSyncOnce.Do(func() { d.fromDataplane <- &proto.DataplaneInSync{} }) + d.maybeReportTyphaRevision() } d.loopSummarizer.EndOfIteration(applyTime) @@ -2351,7 +2381,12 @@ func (d *InternalDataplane) onDatastoreMessage(msg interface{}) { func (d *InternalDataplane) processMsgFromCalcGraph(msg interface{}) { if log.IsLevelEnabled(log.InfoLevel) { - log.Infof("Received %T update from calculation graph. msg=%s", msg, proto.MsgStringer{Msg: msg}.String()) + if _, ok := msg.(*proto.TyphaRevisionUpdate); ok { + // TyphaRevisionUpdate is very noisy, so log at Debug level. + log.Debugf("Received %T update from calculation graph. msg=%s", msg, proto.MsgStringer{Msg: msg}.String()) + } else { + log.Infof("Received %T update from calculation graph. msg=%s", msg, proto.MsgStringer{Msg: msg}.String()) + } } d.datastoreBatchSize++ d.dataplaneNeedsSync = true @@ -2359,11 +2394,17 @@ func (d *InternalDataplane) processMsgFromCalcGraph(msg interface{}) { for _, mgr := range d.allManagers { mgr.OnUpdate(msg) } - switch msg.(type) { + switch msg := msg.(type) { case *proto.InSync: log.WithField("timeSinceStart", time.Since(processStartTime)).Info( "Datastore in sync, flushing the dataplane for the first time...") d.datastoreInSync = true + case *proto.TyphaRevisionUpdate: + d.lastTyphaRevisionUpdate = msg + d.typhaRevisionUpdatePending = true + case *proto.TyphaRevisionRemove: + d.lastTyphaRevisionUpdate = nil + d.typhaRevisionUpdatePending = true } } @@ -2802,6 +2843,36 @@ func (d *InternalDataplane) reportHealth() { } } +func (d *InternalDataplane) maybeReportTyphaRevision() { + if !d.typhaRevisionUpdatePending { + return + } + if d.lastTyphaRevisionUpdate == nil { + // Had a revision but now it's been deleted. (Perhaps we reconnected to + // Typha, and it had been downgraded so we didn't get a revision.) + gaugeLastAppliedTyphaTimestamp.Reset() + return + } + serverID := d.lastTyphaRevisionUpdate.ServerID + if d.lastReportedTyphaServerID != serverID { + // If we switch Typha, clear out the previous set of labels so that + // we don't continue to report the old Typha's timestamp. + gaugeLastAppliedTyphaTimestamp.Reset() + } + + revCreationTime := d.lastTyphaRevisionUpdate.Timestamp.AsTime() + unixTime := float64(revCreationTime.UnixMicro()) / 1e6 + gaugeLastAppliedTyphaTimestamp.WithLabelValues(serverID).Set(unixTime) + + d.lastReportedTyphaServerID = serverID + if revCreationTime.After(processStartTime) { + // Avoid reporting a huge latency spike when the process starts. The + // initial Typha breadcrumb may be hours old if the datastore is quiet! + summaryTyphaBatchLatency.Observe(time.Since(revCreationTime).Seconds()) + } + d.typhaRevisionUpdatePending = false +} + type dummyLock struct{} func (d dummyLock) Lock() { diff --git a/felix/proto/felixbackend.pb.go b/felix/proto/felixbackend.pb.go index 8309d3ee8e6..a0793eef006 100644 --- a/felix/proto/felixbackend.pb.go +++ b/felix/proto/felixbackend.pb.go @@ -11,6 +11,7 @@ import ( sync "sync" unsafe "unsafe" + timestamp "github.com/golang/protobuf/ptypes/timestamp" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" ) @@ -556,6 +557,8 @@ type ToDataplane struct { // *ToDataplane_WireguardEndpointV6Remove // *ToDataplane_HostMetadataV6Update // *ToDataplane_HostMetadataV6Remove + // *ToDataplane_TyphaRevisionUpdate + // *ToDataplane_TyphaRevisionRemove Payload isToDataplane_Payload `protobuf_oneof:"payload"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -938,6 +941,24 @@ func (x *ToDataplane) GetHostMetadataV6Remove() *HostMetadataV6Remove { return nil } +func (x *ToDataplane) GetTyphaRevisionUpdate() *TyphaRevisionUpdate { + if x != nil { + if x, ok := x.Payload.(*ToDataplane_TyphaRevisionUpdate); ok { + return x.TyphaRevisionUpdate + } + } + return nil +} + +func (x *ToDataplane) GetTyphaRevisionRemove() *TyphaRevisionRemove { + if x != nil { + if x, ok := x.Payload.(*ToDataplane_TyphaRevisionRemove); ok { + return x.TyphaRevisionRemove + } + } + return nil +} + type isToDataplane_Payload interface { isToDataplane_Payload() } @@ -1134,6 +1155,14 @@ type ToDataplane_HostMetadataV6Remove struct { HostMetadataV6Remove *HostMetadataV6Remove `protobuf:"bytes,36,opt,name=host_metadata_v6_remove,json=hostMetadataV6Remove,proto3,oneof"` } +type ToDataplane_TyphaRevisionUpdate struct { + TyphaRevisionUpdate *TyphaRevisionUpdate `protobuf:"bytes,39,opt,name=typha_revision_update,json=typhaRevisionUpdate,proto3,oneof"` +} + +type ToDataplane_TyphaRevisionRemove struct { + TyphaRevisionRemove *TyphaRevisionRemove `protobuf:"bytes,40,opt,name=typha_revision_remove,json=typhaRevisionRemove,proto3,oneof"` +} + func (*ToDataplane_InSync) isToDataplane_Payload() {} func (*ToDataplane_IpsetUpdate) isToDataplane_Payload() {} @@ -1208,6 +1237,10 @@ func (*ToDataplane_HostMetadataV6Update) isToDataplane_Payload() {} func (*ToDataplane_HostMetadataV6Remove) isToDataplane_Payload() {} +func (*ToDataplane_TyphaRevisionUpdate) isToDataplane_Payload() {} + +func (*ToDataplane_TyphaRevisionRemove) isToDataplane_Payload() {} + type FromDataplane struct { state protoimpl.MessageState `protogen:"open.v1"` SequenceNumber uint64 `protobuf:"varint,8,opt,name=sequence_number,json=sequenceNumber,proto3" json:"sequence_number,omitempty"` @@ -6319,6 +6352,102 @@ func (x *ServiceRemove) GetNamespace() string { return "" } +type TyphaRevisionUpdate struct { + state protoimpl.MessageState `protogen:"open.v1"` + ServerID string `protobuf:"bytes,2,opt,name=serverID,proto3" json:"serverID,omitempty"` + Revision string `protobuf:"bytes,1,opt,name=revision,proto3" json:"revision,omitempty"` + Timestamp *timestamp.Timestamp `protobuf:"bytes,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TyphaRevisionUpdate) Reset() { + *x = TyphaRevisionUpdate{} + mi := &file_felixbackend_proto_msgTypes[79] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TyphaRevisionUpdate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TyphaRevisionUpdate) ProtoMessage() {} + +func (x *TyphaRevisionUpdate) ProtoReflect() protoreflect.Message { + mi := &file_felixbackend_proto_msgTypes[79] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TyphaRevisionUpdate.ProtoReflect.Descriptor instead. +func (*TyphaRevisionUpdate) Descriptor() ([]byte, []int) { + return file_felixbackend_proto_rawDescGZIP(), []int{79} +} + +func (x *TyphaRevisionUpdate) GetServerID() string { + if x != nil { + return x.ServerID + } + return "" +} + +func (x *TyphaRevisionUpdate) GetRevision() string { + if x != nil { + return x.Revision + } + return "" +} + +func (x *TyphaRevisionUpdate) GetTimestamp() *timestamp.Timestamp { + if x != nil { + return x.Timestamp + } + return nil +} + +type TyphaRevisionRemove struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TyphaRevisionRemove) Reset() { + *x = TyphaRevisionRemove{} + mi := &file_felixbackend_proto_msgTypes[80] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TyphaRevisionRemove) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TyphaRevisionRemove) ProtoMessage() {} + +func (x *TyphaRevisionRemove) ProtoReflect() protoreflect.Message { + mi := &file_felixbackend_proto_msgTypes[80] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TyphaRevisionRemove.ProtoReflect.Descriptor instead. +func (*TyphaRevisionRemove) Descriptor() ([]byte, []int) { + return file_felixbackend_proto_rawDescGZIP(), []int{80} +} + type HTTPMatch_PathMatch struct { state protoimpl.MessageState `protogen:"open.v1"` // Types that are valid to be assigned to PathMatch: @@ -6332,7 +6461,7 @@ type HTTPMatch_PathMatch struct { func (x *HTTPMatch_PathMatch) Reset() { *x = HTTPMatch_PathMatch{} - mi := &file_felixbackend_proto_msgTypes[82] + mi := &file_felixbackend_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6344,7 +6473,7 @@ func (x *HTTPMatch_PathMatch) String() string { func (*HTTPMatch_PathMatch) ProtoMessage() {} func (x *HTTPMatch_PathMatch) ProtoReflect() protoreflect.Message { - mi := &file_felixbackend_proto_msgTypes[82] + mi := &file_felixbackend_proto_msgTypes[84] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6405,8 +6534,8 @@ var File_felixbackend_proto protoreflect.FileDescriptor const file_felixbackend_proto_rawDesc = "" + "\n" + - "\x12felixbackend.proto\x12\x05felix\"\r\n" + - "\vSyncRequest\"\xcb\x16\n" + + "\x12felixbackend.proto\x12\x05felix\x1a\x1fgoogle/protobuf/timestamp.proto\"\r\n" + + "\vSyncRequest\"\xef\x17\n" + "\vToDataplane\x12'\n" + "\x0fsequence_number\x18\x0f \x01(\x04R\x0esequenceNumber\x12(\n" + "\ain_sync\x18\x01 \x01(\v2\r.felix.InSyncH\x00R\x06inSync\x127\n" + @@ -6448,7 +6577,9 @@ const file_felixbackend_proto_rawDesc = "" + "\x1cwireguard_endpoint_v6_update\x18! \x01(\v2 .felix.WireguardEndpointV6UpdateH\x00R\x19wireguardEndpointV6Update\x12c\n" + "\x1cwireguard_endpoint_v6_remove\x18\" \x01(\v2 .felix.WireguardEndpointV6RemoveH\x00R\x19wireguardEndpointV6Remove\x12T\n" + "\x17host_metadata_v6_update\x18# \x01(\v2\x1b.felix.HostMetadataV6UpdateH\x00R\x14hostMetadataV6Update\x12T\n" + - "\x17host_metadata_v6_remove\x18$ \x01(\v2\x1b.felix.HostMetadataV6RemoveH\x00R\x14hostMetadataV6RemoveB\t\n" + + "\x17host_metadata_v6_remove\x18$ \x01(\v2\x1b.felix.HostMetadataV6RemoveH\x00R\x14hostMetadataV6Remove\x12P\n" + + "\x15typha_revision_update\x18' \x01(\v2\x1a.felix.TyphaRevisionUpdateH\x00R\x13typhaRevisionUpdate\x12P\n" + + "\x15typha_revision_remove\x18( \x01(\v2\x1a.felix.TyphaRevisionRemoveH\x00R\x13typhaRevisionRemoveB\t\n" + "\apayload\"\xd3\x05\n" + "\rFromDataplane\x12'\n" + "\x0fsequence_number\x18\b \x01(\x04R\x0esequenceNumber\x12P\n" + @@ -6868,7 +6999,12 @@ const file_felixbackend_proto_rawDesc = "" + "\x05ports\x18\a \x03(\v2\x12.felix.ServicePortR\x05ports\"A\n" + "\rServiceRemove\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\x12\x1c\n" + - "\tnamespace\x18\x02 \x01(\tR\tnamespace*(\n" + + "\tnamespace\x18\x02 \x01(\tR\tnamespace\"\x87\x01\n" + + "\x13TyphaRevisionUpdate\x12\x1a\n" + + "\bserverID\x18\x02 \x01(\tR\bserverID\x12\x1a\n" + + "\brevision\x18\x01 \x01(\tR\brevision\x128\n" + + "\ttimestamp\x18\x03 \x01(\v2\x1a.google.protobuf.TimestampR\ttimestamp\"\x15\n" + + "\x13TyphaRevisionRemove*(\n" + "\tIPVersion\x12\a\n" + "\x03ANY\x10\x00\x12\b\n" + "\x04IPV4\x10\x04\x12\b\n" + @@ -6910,7 +7046,7 @@ func file_felixbackend_proto_rawDescGZIP() []byte { } var file_felixbackend_proto_enumTypes = make([]protoimpl.EnumInfo, 9) -var file_felixbackend_proto_msgTypes = make([]protoimpl.MessageInfo, 88) +var file_felixbackend_proto_msgTypes = make([]protoimpl.MessageInfo, 90) var file_felixbackend_proto_goTypes = []any{ (IPVersion)(0), // 0: felix.IPVersion (RouteType)(0), // 1: felix.RouteType @@ -7000,15 +7136,18 @@ var file_felixbackend_proto_goTypes = []any{ (*ServicePort)(nil), // 85: felix.ServicePort (*ServiceUpdate)(nil), // 86: felix.ServiceUpdate (*ServiceRemove)(nil), // 87: felix.ServiceRemove - nil, // 88: felix.ConfigUpdate.ConfigEntry - nil, // 89: felix.ConfigUpdate.SourceToRawConfigEntry - nil, // 90: felix.RawConfig.ConfigEntry - (*HTTPMatch_PathMatch)(nil), // 91: felix.HTTPMatch.PathMatch - nil, // 92: felix.RuleMetadata.AnnotationsEntry - nil, // 93: felix.WorkloadEndpoint.AnnotationsEntry - nil, // 94: felix.HostMetadataV4V6Update.LabelsEntry - nil, // 95: felix.ServiceAccountUpdate.LabelsEntry - nil, // 96: felix.NamespaceUpdate.LabelsEntry + (*TyphaRevisionUpdate)(nil), // 88: felix.TyphaRevisionUpdate + (*TyphaRevisionRemove)(nil), // 89: felix.TyphaRevisionRemove + nil, // 90: felix.ConfigUpdate.ConfigEntry + nil, // 91: felix.ConfigUpdate.SourceToRawConfigEntry + nil, // 92: felix.RawConfig.ConfigEntry + (*HTTPMatch_PathMatch)(nil), // 93: felix.HTTPMatch.PathMatch + nil, // 94: felix.RuleMetadata.AnnotationsEntry + nil, // 95: felix.WorkloadEndpoint.AnnotationsEntry + nil, // 96: felix.HostMetadataV4V6Update.LabelsEntry + nil, // 97: felix.ServiceAccountUpdate.LabelsEntry + nil, // 98: felix.NamespaceUpdate.LabelsEntry + (*timestamp.Timestamp)(nil), // 99: google.protobuf.Timestamp } var file_felixbackend_proto_depIdxs = []int32{ 14, // 0: felix.ToDataplane.in_sync:type_name -> felix.InSync @@ -7048,102 +7187,105 @@ var file_felixbackend_proto_depIdxs = []int32{ 83, // 34: felix.ToDataplane.wireguard_endpoint_v6_remove:type_name -> felix.WireguardEndpointV6Remove 59, // 35: felix.ToDataplane.host_metadata_v6_update:type_name -> felix.HostMetadataV6Update 60, // 36: felix.ToDataplane.host_metadata_v6_remove:type_name -> felix.HostMetadataV6Remove - 47, // 37: felix.FromDataplane.process_status_update:type_name -> felix.ProcessStatusUpdate - 48, // 38: felix.FromDataplane.host_endpoint_status_update:type_name -> felix.HostEndpointStatusUpdate - 50, // 39: felix.FromDataplane.host_endpoint_status_remove:type_name -> felix.HostEndpointStatusRemove - 51, // 40: felix.FromDataplane.workload_endpoint_status_update:type_name -> felix.WorkloadEndpointStatusUpdate - 52, // 41: felix.FromDataplane.workload_endpoint_status_remove:type_name -> felix.WorkloadEndpointStatusRemove - 53, // 42: felix.FromDataplane.wireguard_status_update:type_name -> felix.WireguardStatusUpdate - 54, // 43: felix.FromDataplane.dataplane_in_sync:type_name -> felix.DataplaneInSync - 88, // 44: felix.ConfigUpdate.config:type_name -> felix.ConfigUpdate.ConfigEntry - 89, // 45: felix.ConfigUpdate.source_to_raw_config:type_name -> felix.ConfigUpdate.SourceToRawConfigEntry - 90, // 46: felix.RawConfig.config:type_name -> felix.RawConfig.ConfigEntry - 4, // 47: felix.IPSetUpdate.type:type_name -> felix.IPSetUpdate.IPSetType - 20, // 48: felix.ActiveProfileUpdate.id:type_name -> felix.ProfileID - 21, // 49: felix.ActiveProfileUpdate.profile:type_name -> felix.Profile - 20, // 50: felix.ActiveProfileRemove.id:type_name -> felix.ProfileID - 26, // 51: felix.Profile.inbound_rules:type_name -> felix.Rule - 26, // 52: felix.Profile.outbound_rules:type_name -> felix.Rule - 24, // 53: felix.ActivePolicyUpdate.id:type_name -> felix.PolicyID - 25, // 54: felix.ActivePolicyUpdate.policy:type_name -> felix.Policy - 24, // 55: felix.ActivePolicyRemove.id:type_name -> felix.PolicyID - 26, // 56: felix.Policy.inbound_rules:type_name -> felix.Rule - 26, // 57: felix.Policy.outbound_rules:type_name -> felix.Rule - 0, // 58: felix.Rule.ip_version:type_name -> felix.IPVersion - 31, // 59: felix.Rule.protocol:type_name -> felix.Protocol - 32, // 60: felix.Rule.src_ports:type_name -> felix.PortRange - 32, // 61: felix.Rule.dst_ports:type_name -> felix.PortRange - 30, // 62: felix.Rule.icmp_type_code:type_name -> felix.IcmpTypeAndCode - 31, // 63: felix.Rule.not_protocol:type_name -> felix.Protocol - 32, // 64: felix.Rule.not_src_ports:type_name -> felix.PortRange - 32, // 65: felix.Rule.not_dst_ports:type_name -> felix.PortRange - 30, // 66: felix.Rule.not_icmp_type_code:type_name -> felix.IcmpTypeAndCode - 27, // 67: felix.Rule.src_service_account_match:type_name -> felix.ServiceAccountMatch - 27, // 68: felix.Rule.dst_service_account_match:type_name -> felix.ServiceAccountMatch - 28, // 69: felix.Rule.http_match:type_name -> felix.HTTPMatch - 29, // 70: felix.Rule.metadata:type_name -> felix.RuleMetadata - 91, // 71: felix.HTTPMatch.paths:type_name -> felix.HTTPMatch.PathMatch - 92, // 72: felix.RuleMetadata.annotations:type_name -> felix.RuleMetadata.AnnotationsEntry - 33, // 73: felix.WorkloadEndpointUpdate.id:type_name -> felix.WorkloadEndpointID - 36, // 74: felix.WorkloadEndpointUpdate.endpoint:type_name -> felix.WorkloadEndpoint - 45, // 75: felix.WorkloadEndpoint.tiers:type_name -> felix.TierInfo - 46, // 76: felix.WorkloadEndpoint.ipv4_nat:type_name -> felix.NatInfo - 46, // 77: felix.WorkloadEndpoint.ipv6_nat:type_name -> felix.NatInfo - 93, // 78: felix.WorkloadEndpoint.annotations:type_name -> felix.WorkloadEndpoint.AnnotationsEntry - 37, // 79: felix.WorkloadEndpoint.qos_controls:type_name -> felix.QoSControls - 39, // 80: felix.WorkloadEndpoint.local_bgp_peer:type_name -> felix.LocalBGPPeer - 35, // 81: felix.WorkloadEndpoint.skip_redir:type_name -> felix.WorkloadBpfSkipRedir - 38, // 82: felix.WorkloadEndpoint.qos_policies:type_name -> felix.QoSPolicy - 33, // 83: felix.WorkloadEndpointRemove.id:type_name -> felix.WorkloadEndpointID - 41, // 84: felix.HostEndpointUpdate.id:type_name -> felix.HostEndpointID - 43, // 85: felix.HostEndpointUpdate.endpoint:type_name -> felix.HostEndpoint - 45, // 86: felix.HostEndpoint.tiers:type_name -> felix.TierInfo - 45, // 87: felix.HostEndpoint.untracked_tiers:type_name -> felix.TierInfo - 45, // 88: felix.HostEndpoint.pre_dnat_tiers:type_name -> felix.TierInfo - 45, // 89: felix.HostEndpoint.forward_tiers:type_name -> felix.TierInfo - 38, // 90: felix.HostEndpoint.qos_policies:type_name -> felix.QoSPolicy - 41, // 91: felix.HostEndpointRemove.id:type_name -> felix.HostEndpointID - 41, // 92: felix.HostEndpointStatusUpdate.id:type_name -> felix.HostEndpointID - 49, // 93: felix.HostEndpointStatusUpdate.status:type_name -> felix.EndpointStatus - 41, // 94: felix.HostEndpointStatusRemove.id:type_name -> felix.HostEndpointID - 33, // 95: felix.WorkloadEndpointStatusUpdate.id:type_name -> felix.WorkloadEndpointID - 49, // 96: felix.WorkloadEndpointStatusUpdate.status:type_name -> felix.EndpointStatus - 36, // 97: felix.WorkloadEndpointStatusUpdate.endpoint:type_name -> felix.WorkloadEndpoint - 33, // 98: felix.WorkloadEndpointStatusRemove.id:type_name -> felix.WorkloadEndpointID - 0, // 99: felix.WireguardStatusUpdate.ip_version:type_name -> felix.IPVersion - 94, // 100: felix.HostMetadataV4V6Update.labels:type_name -> felix.HostMetadataV4V6Update.LabelsEntry - 63, // 101: felix.IPAMPoolUpdate.pool:type_name -> felix.IPAMPool - 67, // 102: felix.ServiceAccountUpdate.id:type_name -> felix.ServiceAccountID - 95, // 103: felix.ServiceAccountUpdate.labels:type_name -> felix.ServiceAccountUpdate.LabelsEntry - 67, // 104: felix.ServiceAccountRemove.id:type_name -> felix.ServiceAccountID - 70, // 105: felix.NamespaceUpdate.id:type_name -> felix.NamespaceID - 96, // 106: felix.NamespaceUpdate.labels:type_name -> felix.NamespaceUpdate.LabelsEntry - 70, // 107: felix.NamespaceRemove.id:type_name -> felix.NamespaceID - 1, // 108: felix.RouteUpdate.types:type_name -> felix.RouteType - 2, // 109: felix.RouteUpdate.ip_pool_type:type_name -> felix.IPPoolType - 71, // 110: felix.RouteUpdate.tunnel_type:type_name -> felix.TunnelType - 31, // 111: felix.DataplaneStats.protocol:type_name -> felix.Protocol - 78, // 112: felix.DataplaneStats.stats:type_name -> felix.Statistic - 79, // 113: felix.DataplaneStats.rules:type_name -> felix.RuleTrace - 3, // 114: felix.DataplaneStats.action:type_name -> felix.Action - 5, // 115: felix.Statistic.direction:type_name -> felix.Statistic.Direction - 6, // 116: felix.Statistic.relativity:type_name -> felix.Statistic.Relativity - 7, // 117: felix.Statistic.kind:type_name -> felix.Statistic.Kind - 3, // 118: felix.Statistic.action:type_name -> felix.Action - 24, // 119: felix.RuleTrace.policy:type_name -> felix.PolicyID - 20, // 120: felix.RuleTrace.profile:type_name -> felix.ProfileID - 8, // 121: felix.RuleTrace.direction:type_name -> felix.RuleTrace.Direction - 85, // 122: felix.ServiceUpdate.ports:type_name -> felix.ServicePort - 13, // 123: felix.ConfigUpdate.SourceToRawConfigEntry.value:type_name -> felix.RawConfig - 9, // 124: felix.PolicySync.Sync:input_type -> felix.SyncRequest - 77, // 125: felix.PolicySync.Report:input_type -> felix.DataplaneStats - 10, // 126: felix.PolicySync.Sync:output_type -> felix.ToDataplane - 76, // 127: felix.PolicySync.Report:output_type -> felix.ReportResult - 126, // [126:128] is the sub-list for method output_type - 124, // [124:126] is the sub-list for method input_type - 124, // [124:124] is the sub-list for extension type_name - 124, // [124:124] is the sub-list for extension extendee - 0, // [0:124] is the sub-list for field type_name + 88, // 37: felix.ToDataplane.typha_revision_update:type_name -> felix.TyphaRevisionUpdate + 89, // 38: felix.ToDataplane.typha_revision_remove:type_name -> felix.TyphaRevisionRemove + 47, // 39: felix.FromDataplane.process_status_update:type_name -> felix.ProcessStatusUpdate + 48, // 40: felix.FromDataplane.host_endpoint_status_update:type_name -> felix.HostEndpointStatusUpdate + 50, // 41: felix.FromDataplane.host_endpoint_status_remove:type_name -> felix.HostEndpointStatusRemove + 51, // 42: felix.FromDataplane.workload_endpoint_status_update:type_name -> felix.WorkloadEndpointStatusUpdate + 52, // 43: felix.FromDataplane.workload_endpoint_status_remove:type_name -> felix.WorkloadEndpointStatusRemove + 53, // 44: felix.FromDataplane.wireguard_status_update:type_name -> felix.WireguardStatusUpdate + 54, // 45: felix.FromDataplane.dataplane_in_sync:type_name -> felix.DataplaneInSync + 90, // 46: felix.ConfigUpdate.config:type_name -> felix.ConfigUpdate.ConfigEntry + 91, // 47: felix.ConfigUpdate.source_to_raw_config:type_name -> felix.ConfigUpdate.SourceToRawConfigEntry + 92, // 48: felix.RawConfig.config:type_name -> felix.RawConfig.ConfigEntry + 4, // 49: felix.IPSetUpdate.type:type_name -> felix.IPSetUpdate.IPSetType + 20, // 50: felix.ActiveProfileUpdate.id:type_name -> felix.ProfileID + 21, // 51: felix.ActiveProfileUpdate.profile:type_name -> felix.Profile + 20, // 52: felix.ActiveProfileRemove.id:type_name -> felix.ProfileID + 26, // 53: felix.Profile.inbound_rules:type_name -> felix.Rule + 26, // 54: felix.Profile.outbound_rules:type_name -> felix.Rule + 24, // 55: felix.ActivePolicyUpdate.id:type_name -> felix.PolicyID + 25, // 56: felix.ActivePolicyUpdate.policy:type_name -> felix.Policy + 24, // 57: felix.ActivePolicyRemove.id:type_name -> felix.PolicyID + 26, // 58: felix.Policy.inbound_rules:type_name -> felix.Rule + 26, // 59: felix.Policy.outbound_rules:type_name -> felix.Rule + 0, // 60: felix.Rule.ip_version:type_name -> felix.IPVersion + 31, // 61: felix.Rule.protocol:type_name -> felix.Protocol + 32, // 62: felix.Rule.src_ports:type_name -> felix.PortRange + 32, // 63: felix.Rule.dst_ports:type_name -> felix.PortRange + 30, // 64: felix.Rule.icmp_type_code:type_name -> felix.IcmpTypeAndCode + 31, // 65: felix.Rule.not_protocol:type_name -> felix.Protocol + 32, // 66: felix.Rule.not_src_ports:type_name -> felix.PortRange + 32, // 67: felix.Rule.not_dst_ports:type_name -> felix.PortRange + 30, // 68: felix.Rule.not_icmp_type_code:type_name -> felix.IcmpTypeAndCode + 27, // 69: felix.Rule.src_service_account_match:type_name -> felix.ServiceAccountMatch + 27, // 70: felix.Rule.dst_service_account_match:type_name -> felix.ServiceAccountMatch + 28, // 71: felix.Rule.http_match:type_name -> felix.HTTPMatch + 29, // 72: felix.Rule.metadata:type_name -> felix.RuleMetadata + 93, // 73: felix.HTTPMatch.paths:type_name -> felix.HTTPMatch.PathMatch + 94, // 74: felix.RuleMetadata.annotations:type_name -> felix.RuleMetadata.AnnotationsEntry + 33, // 75: felix.WorkloadEndpointUpdate.id:type_name -> felix.WorkloadEndpointID + 36, // 76: felix.WorkloadEndpointUpdate.endpoint:type_name -> felix.WorkloadEndpoint + 45, // 77: felix.WorkloadEndpoint.tiers:type_name -> felix.TierInfo + 46, // 78: felix.WorkloadEndpoint.ipv4_nat:type_name -> felix.NatInfo + 46, // 79: felix.WorkloadEndpoint.ipv6_nat:type_name -> felix.NatInfo + 95, // 80: felix.WorkloadEndpoint.annotations:type_name -> felix.WorkloadEndpoint.AnnotationsEntry + 37, // 81: felix.WorkloadEndpoint.qos_controls:type_name -> felix.QoSControls + 39, // 82: felix.WorkloadEndpoint.local_bgp_peer:type_name -> felix.LocalBGPPeer + 35, // 83: felix.WorkloadEndpoint.skip_redir:type_name -> felix.WorkloadBpfSkipRedir + 38, // 84: felix.WorkloadEndpoint.qos_policies:type_name -> felix.QoSPolicy + 33, // 85: felix.WorkloadEndpointRemove.id:type_name -> felix.WorkloadEndpointID + 41, // 86: felix.HostEndpointUpdate.id:type_name -> felix.HostEndpointID + 43, // 87: felix.HostEndpointUpdate.endpoint:type_name -> felix.HostEndpoint + 45, // 88: felix.HostEndpoint.tiers:type_name -> felix.TierInfo + 45, // 89: felix.HostEndpoint.untracked_tiers:type_name -> felix.TierInfo + 45, // 90: felix.HostEndpoint.pre_dnat_tiers:type_name -> felix.TierInfo + 45, // 91: felix.HostEndpoint.forward_tiers:type_name -> felix.TierInfo + 38, // 92: felix.HostEndpoint.qos_policies:type_name -> felix.QoSPolicy + 41, // 93: felix.HostEndpointRemove.id:type_name -> felix.HostEndpointID + 41, // 94: felix.HostEndpointStatusUpdate.id:type_name -> felix.HostEndpointID + 49, // 95: felix.HostEndpointStatusUpdate.status:type_name -> felix.EndpointStatus + 41, // 96: felix.HostEndpointStatusRemove.id:type_name -> felix.HostEndpointID + 33, // 97: felix.WorkloadEndpointStatusUpdate.id:type_name -> felix.WorkloadEndpointID + 49, // 98: felix.WorkloadEndpointStatusUpdate.status:type_name -> felix.EndpointStatus + 36, // 99: felix.WorkloadEndpointStatusUpdate.endpoint:type_name -> felix.WorkloadEndpoint + 33, // 100: felix.WorkloadEndpointStatusRemove.id:type_name -> felix.WorkloadEndpointID + 0, // 101: felix.WireguardStatusUpdate.ip_version:type_name -> felix.IPVersion + 96, // 102: felix.HostMetadataV4V6Update.labels:type_name -> felix.HostMetadataV4V6Update.LabelsEntry + 63, // 103: felix.IPAMPoolUpdate.pool:type_name -> felix.IPAMPool + 67, // 104: felix.ServiceAccountUpdate.id:type_name -> felix.ServiceAccountID + 97, // 105: felix.ServiceAccountUpdate.labels:type_name -> felix.ServiceAccountUpdate.LabelsEntry + 67, // 106: felix.ServiceAccountRemove.id:type_name -> felix.ServiceAccountID + 70, // 107: felix.NamespaceUpdate.id:type_name -> felix.NamespaceID + 98, // 108: felix.NamespaceUpdate.labels:type_name -> felix.NamespaceUpdate.LabelsEntry + 70, // 109: felix.NamespaceRemove.id:type_name -> felix.NamespaceID + 1, // 110: felix.RouteUpdate.types:type_name -> felix.RouteType + 2, // 111: felix.RouteUpdate.ip_pool_type:type_name -> felix.IPPoolType + 71, // 112: felix.RouteUpdate.tunnel_type:type_name -> felix.TunnelType + 31, // 113: felix.DataplaneStats.protocol:type_name -> felix.Protocol + 78, // 114: felix.DataplaneStats.stats:type_name -> felix.Statistic + 79, // 115: felix.DataplaneStats.rules:type_name -> felix.RuleTrace + 3, // 116: felix.DataplaneStats.action:type_name -> felix.Action + 5, // 117: felix.Statistic.direction:type_name -> felix.Statistic.Direction + 6, // 118: felix.Statistic.relativity:type_name -> felix.Statistic.Relativity + 7, // 119: felix.Statistic.kind:type_name -> felix.Statistic.Kind + 3, // 120: felix.Statistic.action:type_name -> felix.Action + 24, // 121: felix.RuleTrace.policy:type_name -> felix.PolicyID + 20, // 122: felix.RuleTrace.profile:type_name -> felix.ProfileID + 8, // 123: felix.RuleTrace.direction:type_name -> felix.RuleTrace.Direction + 85, // 124: felix.ServiceUpdate.ports:type_name -> felix.ServicePort + 99, // 125: felix.TyphaRevisionUpdate.timestamp:type_name -> google.protobuf.Timestamp + 13, // 126: felix.ConfigUpdate.SourceToRawConfigEntry.value:type_name -> felix.RawConfig + 9, // 127: felix.PolicySync.Sync:input_type -> felix.SyncRequest + 77, // 128: felix.PolicySync.Report:input_type -> felix.DataplaneStats + 10, // 129: felix.PolicySync.Sync:output_type -> felix.ToDataplane + 76, // 130: felix.PolicySync.Report:output_type -> felix.ReportResult + 129, // [129:131] is the sub-list for method output_type + 127, // [127:129] is the sub-list for method input_type + 127, // [127:127] is the sub-list for extension type_name + 127, // [127:127] is the sub-list for extension extendee + 0, // [0:127] is the sub-list for field type_name } func init() { file_felixbackend_proto_init() } @@ -7189,6 +7331,8 @@ func file_felixbackend_proto_init() { (*ToDataplane_WireguardEndpointV6Remove)(nil), (*ToDataplane_HostMetadataV6Update)(nil), (*ToDataplane_HostMetadataV6Remove)(nil), + (*ToDataplane_TyphaRevisionUpdate)(nil), + (*ToDataplane_TyphaRevisionRemove)(nil), } file_felixbackend_proto_msgTypes[2].OneofWrappers = []any{ (*FromDataplane_ProcessStatusUpdate)(nil), @@ -7214,7 +7358,7 @@ func file_felixbackend_proto_init() { (*RuleTrace_Profile)(nil), (*RuleTrace_None)(nil), } - file_felixbackend_proto_msgTypes[82].OneofWrappers = []any{ + file_felixbackend_proto_msgTypes[84].OneofWrappers = []any{ (*HTTPMatch_PathMatch_Exact)(nil), (*HTTPMatch_PathMatch_Prefix)(nil), } @@ -7224,7 +7368,7 @@ func file_felixbackend_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_felixbackend_proto_rawDesc), len(file_felixbackend_proto_rawDesc)), NumEnums: 9, - NumMessages: 88, + NumMessages: 90, NumExtensions: 0, NumServices: 1, }, diff --git a/felix/proto/felixbackend.proto b/felix/proto/felixbackend.proto index 003651887fe..72cdc61a1ce 100644 --- a/felix/proto/felixbackend.proto +++ b/felix/proto/felixbackend.proto @@ -2,6 +2,8 @@ syntax = "proto3"; package felix; option go_package = "./proto"; +import "google/protobuf/timestamp.proto"; + service PolicySync { // On this API, only the following payloads will be sent: // - InSync @@ -142,6 +144,9 @@ message ToDataplane { HostMetadataV6Update host_metadata_v6_update = 35; // HostMetadataV6Remove is sent when a host IPv6 address is removed. HostMetadataV6Remove host_metadata_v6_remove = 36; + + TyphaRevisionUpdate typha_revision_update = 39; + TyphaRevisionRemove typha_revision_remove = 40; } } @@ -827,3 +832,12 @@ message ServiceRemove { string name = 1; string namespace = 2; } + +message TyphaRevisionUpdate { + string serverID = 2; + string revision = 1; + google.protobuf.Timestamp timestamp = 3; +} + +message TyphaRevisionRemove { +} diff --git a/go.mod b/go.mod index 451878e511c..45912841bf2 100644 --- a/go.mod +++ b/go.mod @@ -226,7 +226,7 @@ require ( github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/protobuf v1.5.4 github.com/gonvenience/bunt v1.3.5 // indirect github.com/gonvenience/neat v1.3.12 // indirect github.com/gonvenience/term v1.0.2 // indirect diff --git a/libcalico-go/lib/backend/model/keys.go b/libcalico-go/lib/backend/model/keys.go index c907ede96e5..3404108eeaf 100644 --- a/libcalico-go/lib/backend/model/keys.go +++ b/libcalico-go/lib/backend/model/keys.go @@ -355,6 +355,17 @@ func keyFromDefaultPathInner(path string, parts []string) Key { return ProfileLabelsKey{ProfileKey: ProfileKey{pk}} } } + case "typha": + if len(parts) < 4 { + return nil + } + switch parts[3] { + case "revision": + if len(parts) != 4 { + return nil + } + return TyphaRevisionKey{} + } } case "bgp": switch parts[2] { diff --git a/libcalico-go/lib/backend/model/typha.go b/libcalico-go/lib/backend/model/typha.go new file mode 100644 index 00000000000..b7ff66f5691 --- /dev/null +++ b/libcalico-go/lib/backend/model/typha.go @@ -0,0 +1,77 @@ +// Copyright (c) 2025 Tigera, Inc. All rights reserved. + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "fmt" + "reflect" + + log "github.com/sirupsen/logrus" + + "github.com/projectcalico/calico/lib/std/time" +) + +var ( + typeTyphaRevision = reflect.TypeOf(TyphaRevision{}) +) + +type TyphaRevisionKey struct{} + +func (key TyphaRevisionKey) defaultPath() (string, error) { + e := fmt.Sprintf("/calico/v1/typha/revision") + return e, nil +} + +func (key TyphaRevisionKey) defaultDeletePath() (string, error) { + return key.defaultPath() +} + +func (key TyphaRevisionKey) defaultDeleteParentPaths() ([]string, error) { + return nil, nil +} + +func (key TyphaRevisionKey) valueType() (reflect.Type, error) { + return typeTyphaRevision, nil +} + +func (key TyphaRevisionKey) String() string { + return fmt.Sprintf("TyphaRevision()") +} + +type TyphaRevisionListOptions struct { +} + +func (options TyphaRevisionListOptions) defaultPathRoot() string { + return "/calico/v1/typha/revision" +} + +func (options TyphaRevisionListOptions) KeyFromDefaultPath(path string) Key { + log.Debugf("Get TyphaRevision key from %s", path) + if path == "/calico/v1/typha/revision" { + return TyphaRevisionKey{} + } + return nil +} + +type TyphaRevision struct { + // ServerID is unique per invocation of Typha. Allows the client to spot + // when it has reconnected to a different Typha instance and the Revision + // is from a different sequence. + ServerID string `json:"serverID,omitempty"` + // Revision contains Typha's current internal per-instance revision. + Revision string `json:"revision,omitempty"` + // Timestamp is the time at which Typha generated this revision. + Timestamp time.Time `json:"timestamp,omitempty"` +} diff --git a/typha/pkg/daemon/daemon.go b/typha/pkg/daemon/daemon.go index 348647c2f14..e8f235787d1 100644 --- a/typha/pkg/daemon/daemon.go +++ b/typha/pkg/daemon/daemon.go @@ -16,6 +16,8 @@ package daemon import ( "context" + cryptorand "crypto/rand" + "encoding/base32" "os" "os/signal" "runtime" @@ -71,6 +73,7 @@ type TyphaDaemon struct { ConfigFilePath string DatastoreClient DatastoreClient ConfigParams *config.Config + serverID string // The components of the server, created in CreateServer() below. SyncerPipelines []*syncerPipeline @@ -123,9 +126,19 @@ func New() *TyphaDaemon { ConfigureEarlyLogging: logutils.ConfigureEarlyLogging, ConfigureLogging: logutils.ConfigureLogging, CachesBySyncerType: map[syncproto.SyncerType]syncserver.BreadcrumbProvider{}, + serverID: makeUniqueServerID(), } } +func makeUniqueServerID() string { + // Generate a random ID using crypto/rand. + var serverID [16]byte + if _, err := cryptorand.Read(serverID[:]); err != nil { + log.WithError(err).Panic("Failed to generate unique server ID") + } + return base32.StdEncoding.WithPadding(base32.NoPadding).EncodeToString(serverID[:]) +} + func (t *TyphaDaemon) InitializeAndServeForever(cxt context.Context) error { t.DoEarlyRuntimeSetup() t.ParseCommandLineArgs(nil) @@ -350,6 +363,7 @@ func (t *TyphaDaemon) addSyncerPipeline( // Create our snapshot cache, which stores point-in-time copies of the datastore contents. cache := snapcache.New(snapcache.Config{ + ServerID: t.serverID, MaxBatchSize: t.ConfigParams.SnapshotCacheMaxBatchSize, HealthAggregator: t.healthAggregator, Name: string(syncerType), @@ -373,6 +387,7 @@ func (t *TyphaDaemon) CreateServer() { t.healthAggregator = health.NewHealthAggregator() // Now create the Syncer and caching layer (one pipeline for each syncer we support). + snapcache.PreCreateMetrics(t.serverID) t.addSyncerPipeline(syncproto.SyncerTypeFelix, t.DatastoreClient.FelixSyncerByIface) t.addSyncerPipeline(syncproto.SyncerTypeBGP, t.DatastoreClient.BGPSyncerByIface) t.addSyncerPipeline(syncproto.SyncerTypeTunnelIPAllocation, t.DatastoreClient.TunnelIPAllocationSyncerByIface) diff --git a/typha/pkg/promutils/registration.go b/typha/pkg/promutils/registration.go index a451df2ead9..f5e1aa4d52d 100644 --- a/typha/pkg/promutils/registration.go +++ b/typha/pkg/promutils/registration.go @@ -46,3 +46,14 @@ func PreCreateGaugePerSyncer(cv *prometheus.GaugeVec) { cv.WithLabelValues(string(st)) } } +func PreCreateCounterPerServerIDSyncer(serverID string, cv *prometheus.CounterVec) { + for _, st := range syncproto.AllSyncerTypes { + cv.WithLabelValues(serverID, string(st)) + } +} + +func PreCreateGaugePerServerIDSyncer(serverID string, cv *prometheus.GaugeVec) { + for _, st := range syncproto.AllSyncerTypes { + cv.WithLabelValues(serverID, string(st)) + } +} diff --git a/typha/pkg/snapcache/cache.go b/typha/pkg/snapcache/cache.go index 1c7359c98e3..c436c0fd7d9 100644 --- a/typha/pkg/snapcache/cache.go +++ b/typha/pkg/snapcache/cache.go @@ -16,6 +16,7 @@ package snapcache import ( "context" + "fmt" "strings" "sync" "sync/atomic" @@ -27,6 +28,7 @@ import ( log "github.com/sirupsen/logrus" "github.com/projectcalico/calico/libcalico-go/lib/backend/api" + "github.com/projectcalico/calico/libcalico-go/lib/backend/model" "github.com/projectcalico/calico/libcalico-go/lib/health" cprometheus "github.com/projectcalico/calico/libcalico-go/lib/prometheus" "github.com/projectcalico/calico/typha/pkg/jitter" @@ -40,47 +42,56 @@ const ( ) var ( - syncerLabel = []string{"syncer"} + promLabels = []string{"server_id", "syncer"} gaugeVecCurrentSequenceNumber = prometheus.NewGaugeVec(prometheus.GaugeOpts{ Name: "typha_breadcrumb_seq_number", Help: "Current (server-local) sequence number; number of snapshot deltas processed.", - }, syncerLabel) + }, promLabels) + gaugeVecCurrentBreadcrumbTimestamp = prometheus.NewGaugeVec(prometheus.GaugeOpts{ + Name: "typha_breadcrumb_timestamp", + Help: "Timestamp of the most recently processed batch of updates from the datastore.", + }, promLabels) counterVecBreadcrumbNonBlock = prometheus.NewCounterVec(prometheus.CounterOpts{ Name: "typha_breadcrumb_non_block", Help: "Count of the number of times Typha got the next Breadcrumb without blocking.", - }, syncerLabel) + }, promLabels) counterVecBreadcrumbBlock = prometheus.NewCounterVec(prometheus.CounterOpts{ Name: "typha_breadcrumb_block", Help: "Count of the number of times Typha got the next Breadcrumb after blocking.", - }, syncerLabel) + }, promLabels) counterVecUpdatesTotal = prometheus.NewCounterVec(prometheus.CounterOpts{ Name: "typha_updates_total", Help: "Total number of updates received from the Syncer.", - }, syncerLabel) + }, promLabels) counterVecUpdatesSkipped = prometheus.NewCounterVec(prometheus.CounterOpts{ Name: "typha_updates_skipped", Help: "Total number of updates skipped as duplicates.", - }, syncerLabel) + }, promLabels) gaugeVecSnapshotSize = prometheus.NewGaugeVec(prometheus.GaugeOpts{ Name: "typha_cache_size", Help: "Current number of key/value pairs contained in the cache of the datastore.", - }, syncerLabel) + }, promLabels) ) func init() { prometheus.MustRegister(gaugeVecCurrentSequenceNumber) - promutils.PreCreateGaugePerSyncer(gaugeVecCurrentSequenceNumber) + prometheus.MustRegister(gaugeVecCurrentBreadcrumbTimestamp) prometheus.MustRegister(gaugeVecSnapshotSize) - promutils.PreCreateGaugePerSyncer(gaugeVecSnapshotSize) prometheus.MustRegister(counterVecBreadcrumbNonBlock) - promutils.PreCreateCounterPerSyncer(counterVecBreadcrumbNonBlock) prometheus.MustRegister(counterVecBreadcrumbBlock) - promutils.PreCreateCounterPerSyncer(counterVecBreadcrumbBlock) prometheus.MustRegister(counterVecUpdatesTotal) - promutils.PreCreateCounterPerSyncer(counterVecUpdatesTotal) prometheus.MustRegister(counterVecUpdatesSkipped) - promutils.PreCreateCounterPerSyncer(counterVecUpdatesSkipped) +} + +func PreCreateMetrics(serverID string) { + promutils.PreCreateGaugePerServerIDSyncer(serverID, gaugeVecCurrentSequenceNumber) + promutils.PreCreateGaugePerServerIDSyncer(serverID, gaugeVecCurrentBreadcrumbTimestamp) + promutils.PreCreateGaugePerServerIDSyncer(serverID, gaugeVecSnapshotSize) + promutils.PreCreateCounterPerServerIDSyncer(serverID, counterVecBreadcrumbNonBlock) + promutils.PreCreateCounterPerServerIDSyncer(serverID, counterVecBreadcrumbBlock) + promutils.PreCreateCounterPerServerIDSyncer(serverID, counterVecUpdatesTotal) + promutils.PreCreateCounterPerServerIDSyncer(serverID, counterVecUpdatesSkipped) } // Cache consumes updates from the Syncer API and caches them in the form of a series of @@ -141,13 +152,14 @@ type Cache struct { wakeUpTicker *jitter.Ticker healthTicks <-chan time.Time - gaugeSnapSize prometheus.Gauge - counterUpdatesTotal prometheus.Counter - counterUpdatesSkipped prometheus.Counter - gaugeCurrentSequenceNumber prometheus.Gauge - counterBreadcrumbBlock prometheus.Counter - counterBreadcrumbNonBlock prometheus.Counter - summaryUpdateSize prometheus.Summary + gaugeSnapSize prometheus.Gauge + counterUpdatesTotal prometheus.Counter + counterUpdatesSkipped prometheus.Counter + gaugeCurrentSequenceNumber prometheus.Gauge + gaugeCurrentBreadcrumbTimestamp prometheus.Gauge + counterBreadcrumbBlock prometheus.Counter + counterBreadcrumbNonBlock prometheus.Counter + summaryUpdateSize prometheus.Summary // Done is created by Start() and closed when the main loop exits. Done chan struct{} @@ -163,6 +175,7 @@ type healthAggregator interface { } type Config struct { + ServerID string MaxBatchSize int WakeUpInterval time.Duration HealthAggregator healthAggregator @@ -201,6 +214,7 @@ func (config *Config) ApplyDefaults() { func New(config Config) *Cache { config.ApplyDefaults() + kvs := btree.NewG[syncproto.SerializedUpdate](2, func(a, b syncproto.SerializedUpdate) bool { return a.Key < b.Key }) cond := sync.NewCond(&sync.Mutex{}) @@ -214,22 +228,24 @@ func New(config Config) *Cache { } var err error - c.gaugeSnapSize, err = gaugeVecSnapshotSize.GetMetricWithLabelValues(config.Name) + c.gaugeSnapSize, err = gaugeVecSnapshotSize.GetMetricWithLabelValues(config.ServerID, config.Name) if err != nil { log.WithError(err).Panic("Bug: failed to get Prometheus gauge.") } - c.counterUpdatesTotal = counterVecUpdatesTotal.WithLabelValues(config.Name) - c.counterUpdatesSkipped = counterVecUpdatesSkipped.WithLabelValues(config.Name) - c.gaugeCurrentSequenceNumber = gaugeVecCurrentSequenceNumber.WithLabelValues(config.Name) - c.counterBreadcrumbNonBlock = counterVecBreadcrumbNonBlock.WithLabelValues(config.Name) - c.counterBreadcrumbBlock = counterVecBreadcrumbBlock.WithLabelValues(config.Name) + c.counterUpdatesTotal = counterVecUpdatesTotal.WithLabelValues(config.ServerID, config.Name) + c.counterUpdatesSkipped = counterVecUpdatesSkipped.WithLabelValues(config.ServerID, config.Name) + c.gaugeCurrentSequenceNumber = gaugeVecCurrentSequenceNumber.WithLabelValues(config.ServerID, config.Name) + c.gaugeCurrentBreadcrumbTimestamp = gaugeVecCurrentBreadcrumbTimestamp.WithLabelValues(config.ServerID, config.Name) + c.counterBreadcrumbNonBlock = counterVecBreadcrumbNonBlock.WithLabelValues(config.ServerID, config.Name) + c.counterBreadcrumbBlock = counterVecBreadcrumbBlock.WithLabelValues(config.ServerID, config.Name) // No vector version of summary so we use an explicit label. promutils.GetOrRegister avoids panics in UT // where the same cache is recreated. c.summaryUpdateSize = promutils.GetOrRegister(cprometheus.NewSummary(prometheus.SummaryOpts{ Name: "typha_breadcrumb_size", Help: "Number of KVs recorded in each breadcrumb.", ConstLabels: map[string]string{ - "syncer": config.Name, + "server_id": config.ServerID, + "syncer": config.Name, }, })) @@ -397,7 +413,7 @@ func (c *Cache) publishBreadcrumb() { Timestamp: time.Now(), SyncStatus: oldCrumb.SyncStatus, nextCond: c.breadcrumbCond, - Deltas: make([]syncproto.SerializedUpdate, 0, len(updates)), + Deltas: make([]syncproto.SerializedUpdate, 0, len(updates)+1), counterBreadcrumbBlock: c.counterBreadcrumbBlock, counterBreadcrumbNonBlock: c.counterBreadcrumbNonBlock, @@ -440,9 +456,7 @@ func (c *Cache) publishBreadcrumb() { // Since the purpose of the snapshot is to hold the initial set of updates to send to Felix at start-of-day, // all the updates that it stores should have type UpdateTypeKVNew since they're all new to Felix. Copy // the KV and adjust it before storing it in the snapshot. - updToStore := newUpd - updToStore.UpdateType = api.UpdateTypeKVNew - c.kvs.ReplaceOrInsert(updToStore) + c.storeUpdateAsTypeKVNew(newUpd) } // Record the update in the new Breadcrumb so that clients following the chain of @@ -460,6 +474,10 @@ func (c *Cache) publishBreadcrumb() { return } + // Something changed, add an extra update to record the revision and + // timestamp. Clients use this to report latency stats. + c.addBreadcrumbRevisionKV(newCrumb) + c.gaugeSnapSize.Set(float64(c.kvs.Len())) // Add the new read-only snapshot to the new crumb. newCrumb.KVs = c.kvs.Clone() @@ -480,6 +498,39 @@ func (c *Cache) publishBreadcrumb() { c.gaugeCurrentSequenceNumber.Set(float64(newCrumb.SequenceNumber)) } +func (c *Cache) addBreadcrumbRevisionKV(newCrumb *Breadcrumb) { + revision := model.TyphaRevision{ + ServerID: c.config.ServerID, + Revision: fmt.Sprint(newCrumb.SequenceNumber), + Timestamp: newCrumb.Timestamp, + } + c.gaugeCurrentBreadcrumbTimestamp.Set(float64(newCrumb.Timestamp.UnixMicro()) * 1e6) + revUpd, err := syncproto.SerializeUpdate(api.Update{ + KVPair: model.KVPair{ + Key: model.TyphaRevisionKey{}, + Value: &revision, + Revision: fmt.Sprint(newCrumb.SequenceNumber), + }, + UpdateType: api.UpdateTypeKVUpdated, + }) + + if err != nil { + log.WithError(err).Error("Failed to serialize Typha revision update") + } else { + // Store the revision in the KVs map so that we don't break our invariant + // that the "sum of the deltas" is the same as the current state of the + // datastore. + c.storeUpdateAsTypeKVNew(revUpd) + newCrumb.Deltas = append(newCrumb.Deltas, revUpd) + } +} + +func (c *Cache) storeUpdateAsTypeKVNew(newUpd syncproto.SerializedUpdate) { + updToStore := newUpd + updToStore.UpdateType = api.UpdateTypeKVNew + c.kvs.ReplaceOrInsert(updToStore) +} + type Breadcrumb struct { SequenceNumber uint64 Timestamp time.Time From 35a2d04c1f1af0bcaa088b599a42f5f6133f2007 Mon Sep 17 00:00:00 2001 From: Shaun Crampton Date: Fri, 5 Sep 2025 10:16:31 +0100 Subject: [PATCH 2/3] Update semaphore yaml. --- .semaphore/semaphore.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.semaphore/semaphore.yml b/.semaphore/semaphore.yml index 46ace773a92..4e5490bab00 100644 --- a/.semaphore/semaphore.yml +++ b/.semaphore/semaphore.yml @@ -153,7 +153,7 @@ blocks: - ../.semaphore/run-and-monitor make-ci.log make ci - name: apiserver run: - when: "change_in(['/api/pkg/apis/projectcalico/v3/*.go','/api/pkg/client/clientset_generated/clientset/*.go','/api/pkg/client/clientset_generated/clientset/scheme/*.go','/api/pkg/client/clientset_generated/clientset/typed/projectcalico/v3/*.go','/api/pkg/lib/numorstring/*.go','/api/pkg/openapi/*.go','/apiserver/**','/crypto/pkg/tls/*.go','/hack/test/certs/','/lib.Makefile','/lib/std/uniquelabels/*.go','/lib/std/uniquestr/*.go','/libcalico-go/lib/apiconfig/*.go','/libcalico-go/lib/apis/v3/*.go','/libcalico-go/lib/backend/*.go','/libcalico-go/lib/backend/api/*.go','/libcalico-go/lib/backend/encap/*.go','/libcalico-go/lib/backend/etcdv3/*.go','/libcalico-go/lib/backend/k8s/*.go','/libcalico-go/lib/backend/k8s/conversion/*.go','/libcalico-go/lib/backend/k8s/resources/*.go','/libcalico-go/lib/backend/k8s/scheme/*.go','/libcalico-go/lib/backend/model/*.go','/libcalico-go/lib/backend/watchersyncer/*.go','/libcalico-go/lib/clientv3/*.go','/libcalico-go/lib/errors/*.go','/libcalico-go/lib/hash/*.go','/libcalico-go/lib/ipam/*.go','/libcalico-go/lib/json/*.go','/libcalico-go/lib/logutils/*.go','/libcalico-go/lib/names/*.go','/libcalico-go/lib/namespace/*.go','/libcalico-go/lib/net/*.go','/libcalico-go/lib/options/*.go','/libcalico-go/lib/resources/*.go','/libcalico-go/lib/selector/*.go','/libcalico-go/lib/selector/parser/*.go','/libcalico-go/lib/selector/tokenizer/*.go','/libcalico-go/lib/set/*.go','/libcalico-go/lib/validator/v3/*.go','/libcalico-go/lib/watch/*.go','/libcalico-go/lib/winutils/*.go','/metadata.mk','/pkg/buildinfo/*.go'], {pipeline_file: 'ignore', exclude: ['/**/*.md','/**/.gitignore','/**/AUTHORS*','/**/CONTRIBUTING*','/**/DEVELOPER_GUIDE*','/**/LICENSE*','/**/README*','/**/SECURITY.md','/api/**/*_test.go','/crypto/**/*_test.go','/lib/**/*_test.go','/libcalico-go/**/*_test.go','/pkg/**/*_test.go']})" + when: "change_in(['/api/pkg/apis/projectcalico/v3/*.go','/api/pkg/client/clientset_generated/clientset/*.go','/api/pkg/client/clientset_generated/clientset/scheme/*.go','/api/pkg/client/clientset_generated/clientset/typed/projectcalico/v3/*.go','/api/pkg/lib/numorstring/*.go','/api/pkg/openapi/*.go','/apiserver/**','/crypto/pkg/tls/*.go','/hack/test/certs/','/lib.Makefile','/lib/std/time/*.go','/lib/std/uniquelabels/*.go','/lib/std/uniquestr/*.go','/libcalico-go/lib/apiconfig/*.go','/libcalico-go/lib/apis/v3/*.go','/libcalico-go/lib/backend/*.go','/libcalico-go/lib/backend/api/*.go','/libcalico-go/lib/backend/encap/*.go','/libcalico-go/lib/backend/etcdv3/*.go','/libcalico-go/lib/backend/k8s/*.go','/libcalico-go/lib/backend/k8s/conversion/*.go','/libcalico-go/lib/backend/k8s/resources/*.go','/libcalico-go/lib/backend/k8s/scheme/*.go','/libcalico-go/lib/backend/model/*.go','/libcalico-go/lib/backend/watchersyncer/*.go','/libcalico-go/lib/clientv3/*.go','/libcalico-go/lib/errors/*.go','/libcalico-go/lib/hash/*.go','/libcalico-go/lib/ipam/*.go','/libcalico-go/lib/json/*.go','/libcalico-go/lib/logutils/*.go','/libcalico-go/lib/names/*.go','/libcalico-go/lib/namespace/*.go','/libcalico-go/lib/net/*.go','/libcalico-go/lib/options/*.go','/libcalico-go/lib/resources/*.go','/libcalico-go/lib/selector/*.go','/libcalico-go/lib/selector/parser/*.go','/libcalico-go/lib/selector/tokenizer/*.go','/libcalico-go/lib/set/*.go','/libcalico-go/lib/validator/v3/*.go','/libcalico-go/lib/watch/*.go','/libcalico-go/lib/winutils/*.go','/metadata.mk','/pkg/buildinfo/*.go'], {pipeline_file: 'ignore', exclude: ['/**/*.md','/**/.gitignore','/**/AUTHORS*','/**/CONTRIBUTING*','/**/DEVELOPER_GUIDE*','/**/LICENSE*','/**/README*','/**/SECURITY.md','/api/**/*_test.go','/crypto/**/*_test.go','/lib/**/*_test.go','/libcalico-go/**/*_test.go','/pkg/**/*_test.go']})" execution_time_limit: minutes: 30 dependencies: @@ -177,7 +177,7 @@ blocks: - ../.semaphore/run-and-monitor image-$ARCH.log make build ARCH=$ARCH - name: app-policy run: - when: "change_in(['/api/pkg/apis/projectcalico/v3/*.go','/api/pkg/lib/numorstring/*.go','/app-policy/**','/crypto/pkg/tls/*.go','/felix/bpf/tc/defs/*.go','/felix/calc/*.go','/felix/config/*.go','/felix/dataplane/ipsets/*.go','/felix/dataplane/linux/dataplanedefs/*.go','/felix/deltatracker/*.go','/felix/dispatcher/*.go','/felix/environment/*.go','/felix/generictables/*.go','/felix/hashutils/*.go','/felix/idalloc/*.go','/felix/ip/*.go','/felix/ipsets/*.go','/felix/iptables/*.go','/felix/iptables/cmdshim/*.go','/felix/k8sutils/*.go','/felix/labelindex/*.go','/felix/labelindex/ipsetmember/*.go','/felix/labelindex/labelnamevalueindex/*.go','/felix/labelindex/labelrestrictionindex/*.go','/felix/logutils/*.go','/felix/markbits/*.go','/felix/multidict/*.go','/felix/netlinkshim/*.go','/felix/nftables/*.go','/felix/proto/*.go','/felix/rules/*.go','/felix/serviceindex/*.go','/felix/stringutils/*.go','/felix/types/*.go','/hack/test/certs/','/lib.Makefile','/lib/std/uniquelabels/*.go','/lib/std/uniquestr/*.go','/libcalico-go/config/*.go','/libcalico-go/lib/apiconfig/*.go','/libcalico-go/lib/apis/v1/*.go','/libcalico-go/lib/apis/v1/unversioned/*.go','/libcalico-go/lib/apis/v3/*.go','/libcalico-go/lib/backend/*.go','/libcalico-go/lib/backend/api/*.go','/libcalico-go/lib/backend/encap/*.go','/libcalico-go/lib/backend/etcdv3/*.go','/libcalico-go/lib/backend/k8s/*.go','/libcalico-go/lib/backend/k8s/conversion/*.go','/libcalico-go/lib/backend/k8s/resources/*.go','/libcalico-go/lib/backend/k8s/scheme/*.go','/libcalico-go/lib/backend/model/*.go','/libcalico-go/lib/clientv3/*.go','/libcalico-go/lib/errors/*.go','/libcalico-go/lib/hash/*.go','/libcalico-go/lib/health/*.go','/libcalico-go/lib/ipam/*.go','/libcalico-go/lib/json/*.go','/libcalico-go/lib/logutils/*.go','/libcalico-go/lib/names/*.go','/libcalico-go/lib/namespace/*.go','/libcalico-go/lib/net/*.go','/libcalico-go/lib/options/*.go','/libcalico-go/lib/packedmap/*.go','/libcalico-go/lib/prometheus/*.go','/libcalico-go/lib/resources/*.go','/libcalico-go/lib/scope/*.go','/libcalico-go/lib/selector/*.go','/libcalico-go/lib/selector/parser/*.go','/libcalico-go/lib/selector/tokenizer/*.go','/libcalico-go/lib/set/*.go','/libcalico-go/lib/validator/v1/*.go','/libcalico-go/lib/validator/v3/*.go','/libcalico-go/lib/watch/*.go','/libcalico-go/lib/winutils/*.go','/metadata.mk','/node/pkg/lifecycle/utils/*.go','/pkg/buildinfo/*.go'], {pipeline_file: 'ignore', exclude: ['/**/*.md','/**/.gitignore','/**/AUTHORS*','/**/CONTRIBUTING*','/**/DEVELOPER_GUIDE*','/**/LICENSE*','/**/README*','/**/SECURITY.md','/api/**/*_test.go','/crypto/**/*_test.go','/felix/**/*_test.go','/lib/**/*_test.go','/libcalico-go/**/*_test.go','/node/**/*_test.go','/pkg/**/*_test.go']})" + when: "change_in(['/api/pkg/apis/projectcalico/v3/*.go','/api/pkg/lib/numorstring/*.go','/app-policy/**','/crypto/pkg/tls/*.go','/felix/bpf/tc/defs/*.go','/felix/calc/*.go','/felix/config/*.go','/felix/dataplane/ipsets/*.go','/felix/dataplane/linux/dataplanedefs/*.go','/felix/deltatracker/*.go','/felix/dispatcher/*.go','/felix/environment/*.go','/felix/generictables/*.go','/felix/hashutils/*.go','/felix/idalloc/*.go','/felix/ip/*.go','/felix/ipsets/*.go','/felix/iptables/*.go','/felix/iptables/cmdshim/*.go','/felix/k8sutils/*.go','/felix/labelindex/*.go','/felix/labelindex/ipsetmember/*.go','/felix/labelindex/labelnamevalueindex/*.go','/felix/labelindex/labelrestrictionindex/*.go','/felix/logutils/*.go','/felix/markbits/*.go','/felix/multidict/*.go','/felix/netlinkshim/*.go','/felix/nftables/*.go','/felix/proto/*.go','/felix/rules/*.go','/felix/serviceindex/*.go','/felix/stringutils/*.go','/felix/types/*.go','/hack/test/certs/','/lib.Makefile','/lib/std/time/*.go','/lib/std/uniquelabels/*.go','/lib/std/uniquestr/*.go','/libcalico-go/config/*.go','/libcalico-go/lib/apiconfig/*.go','/libcalico-go/lib/apis/v1/*.go','/libcalico-go/lib/apis/v1/unversioned/*.go','/libcalico-go/lib/apis/v3/*.go','/libcalico-go/lib/backend/*.go','/libcalico-go/lib/backend/api/*.go','/libcalico-go/lib/backend/encap/*.go','/libcalico-go/lib/backend/etcdv3/*.go','/libcalico-go/lib/backend/k8s/*.go','/libcalico-go/lib/backend/k8s/conversion/*.go','/libcalico-go/lib/backend/k8s/resources/*.go','/libcalico-go/lib/backend/k8s/scheme/*.go','/libcalico-go/lib/backend/model/*.go','/libcalico-go/lib/clientv3/*.go','/libcalico-go/lib/errors/*.go','/libcalico-go/lib/hash/*.go','/libcalico-go/lib/health/*.go','/libcalico-go/lib/ipam/*.go','/libcalico-go/lib/json/*.go','/libcalico-go/lib/logutils/*.go','/libcalico-go/lib/names/*.go','/libcalico-go/lib/namespace/*.go','/libcalico-go/lib/net/*.go','/libcalico-go/lib/options/*.go','/libcalico-go/lib/packedmap/*.go','/libcalico-go/lib/prometheus/*.go','/libcalico-go/lib/resources/*.go','/libcalico-go/lib/scope/*.go','/libcalico-go/lib/selector/*.go','/libcalico-go/lib/selector/parser/*.go','/libcalico-go/lib/selector/tokenizer/*.go','/libcalico-go/lib/set/*.go','/libcalico-go/lib/validator/v1/*.go','/libcalico-go/lib/validator/v3/*.go','/libcalico-go/lib/watch/*.go','/libcalico-go/lib/winutils/*.go','/metadata.mk','/node/pkg/lifecycle/utils/*.go','/pkg/buildinfo/*.go'], {pipeline_file: 'ignore', exclude: ['/**/*.md','/**/.gitignore','/**/AUTHORS*','/**/CONTRIBUTING*','/**/DEVELOPER_GUIDE*','/**/LICENSE*','/**/README*','/**/SECURITY.md','/api/**/*_test.go','/crypto/**/*_test.go','/felix/**/*_test.go','/lib/**/*_test.go','/libcalico-go/**/*_test.go','/node/**/*_test.go','/pkg/**/*_test.go']})" dependencies: - Prerequisites task: @@ -190,7 +190,7 @@ blocks: - ../.semaphore/run-and-monitor ci.log make ci - name: calicoctl run: - when: "change_in(['/api/pkg/apis/projectcalico/v3/*.go','/api/pkg/lib/numorstring/*.go','/calicoctl/**','/crypto/pkg/tls/*.go','/hack/test/certs/','/kube-controllers/pkg/config/*.go','/kube-controllers/pkg/controllers/loadbalancer/*.go','/kube-controllers/pkg/controllers/utils/*.go','/lib.Makefile','/lib/std/uniquelabels/*.go','/lib/std/uniquestr/*.go','/libcalico-go/config/*.go','/libcalico-go/lib/apiconfig/*.go','/libcalico-go/lib/apis/v1/*.go','/libcalico-go/lib/apis/v1/unversioned/*.go','/libcalico-go/lib/apis/v3/*.go','/libcalico-go/lib/backend/*.go','/libcalico-go/lib/backend/api/*.go','/libcalico-go/lib/backend/encap/*.go','/libcalico-go/lib/backend/etcdv3/*.go','/libcalico-go/lib/backend/k8s/*.go','/libcalico-go/lib/backend/k8s/conversion/*.go','/libcalico-go/lib/backend/k8s/resources/*.go','/libcalico-go/lib/backend/k8s/scheme/*.go','/libcalico-go/lib/backend/model/*.go','/libcalico-go/lib/backend/watchersyncer/*.go','/libcalico-go/lib/clientv3/*.go','/libcalico-go/lib/errors/*.go','/libcalico-go/lib/hash/*.go','/libcalico-go/lib/ipam/*.go','/libcalico-go/lib/json/*.go','/libcalico-go/lib/names/*.go','/libcalico-go/lib/namespace/*.go','/libcalico-go/lib/net/*.go','/libcalico-go/lib/options/*.go','/libcalico-go/lib/resources/*.go','/libcalico-go/lib/scope/*.go','/libcalico-go/lib/selector/*.go','/libcalico-go/lib/selector/parser/*.go','/libcalico-go/lib/selector/tokenizer/*.go','/libcalico-go/lib/set/*.go','/libcalico-go/lib/upgrade/converters/*.go','/libcalico-go/lib/validator/v1/*.go','/libcalico-go/lib/validator/v3/*.go','/libcalico-go/lib/watch/*.go','/libcalico-go/lib/winutils/*.go','/metadata.mk','/pkg/buildinfo/*.go'], {pipeline_file: 'ignore', exclude: ['/**/*.md','/**/.gitignore','/**/AUTHORS*','/**/CONTRIBUTING*','/**/DEVELOPER_GUIDE*','/**/LICENSE*','/**/README*','/**/SECURITY.md','/api/**/*_test.go','/crypto/**/*_test.go','/kube-controllers/**/*_test.go','/lib/**/*_test.go','/libcalico-go/**/*_test.go','/pkg/**/*_test.go']})" + when: "change_in(['/api/pkg/apis/projectcalico/v3/*.go','/api/pkg/lib/numorstring/*.go','/calicoctl/**','/crypto/pkg/tls/*.go','/hack/test/certs/','/kube-controllers/pkg/config/*.go','/kube-controllers/pkg/controllers/loadbalancer/*.go','/kube-controllers/pkg/controllers/utils/*.go','/lib.Makefile','/lib/std/time/*.go','/lib/std/uniquelabels/*.go','/lib/std/uniquestr/*.go','/libcalico-go/config/*.go','/libcalico-go/lib/apiconfig/*.go','/libcalico-go/lib/apis/v1/*.go','/libcalico-go/lib/apis/v1/unversioned/*.go','/libcalico-go/lib/apis/v3/*.go','/libcalico-go/lib/backend/*.go','/libcalico-go/lib/backend/api/*.go','/libcalico-go/lib/backend/encap/*.go','/libcalico-go/lib/backend/etcdv3/*.go','/libcalico-go/lib/backend/k8s/*.go','/libcalico-go/lib/backend/k8s/conversion/*.go','/libcalico-go/lib/backend/k8s/resources/*.go','/libcalico-go/lib/backend/k8s/scheme/*.go','/libcalico-go/lib/backend/model/*.go','/libcalico-go/lib/backend/watchersyncer/*.go','/libcalico-go/lib/clientv3/*.go','/libcalico-go/lib/errors/*.go','/libcalico-go/lib/hash/*.go','/libcalico-go/lib/ipam/*.go','/libcalico-go/lib/json/*.go','/libcalico-go/lib/names/*.go','/libcalico-go/lib/namespace/*.go','/libcalico-go/lib/net/*.go','/libcalico-go/lib/options/*.go','/libcalico-go/lib/resources/*.go','/libcalico-go/lib/scope/*.go','/libcalico-go/lib/selector/*.go','/libcalico-go/lib/selector/parser/*.go','/libcalico-go/lib/selector/tokenizer/*.go','/libcalico-go/lib/set/*.go','/libcalico-go/lib/upgrade/converters/*.go','/libcalico-go/lib/validator/v1/*.go','/libcalico-go/lib/validator/v3/*.go','/libcalico-go/lib/watch/*.go','/libcalico-go/lib/winutils/*.go','/metadata.mk','/pkg/buildinfo/*.go'], {pipeline_file: 'ignore', exclude: ['/**/*.md','/**/.gitignore','/**/AUTHORS*','/**/CONTRIBUTING*','/**/DEVELOPER_GUIDE*','/**/LICENSE*','/**/README*','/**/SECURITY.md','/api/**/*_test.go','/crypto/**/*_test.go','/kube-controllers/**/*_test.go','/lib/**/*_test.go','/libcalico-go/**/*_test.go','/pkg/**/*_test.go']})" dependencies: - Prerequisites task: @@ -203,7 +203,7 @@ blocks: - ../.semaphore/run-and-monitor ci.log make ci - name: cni-plugin run: - when: "change_in(['/api/pkg/apis/projectcalico/v3/*.go','/api/pkg/lib/numorstring/*.go','/cni-plugin/**','/crypto/pkg/tls/*.go','/hack/test/certs/','/lib.Makefile','/lib/std/uniquelabels/*.go','/lib/std/uniquestr/*.go','/libcalico-go/lib/apiconfig/*.go','/libcalico-go/lib/apis/v3/*.go','/libcalico-go/lib/backend/*.go','/libcalico-go/lib/backend/api/*.go','/libcalico-go/lib/backend/encap/*.go','/libcalico-go/lib/backend/etcdv3/*.go','/libcalico-go/lib/backend/k8s/*.go','/libcalico-go/lib/backend/k8s/conversion/*.go','/libcalico-go/lib/backend/k8s/resources/*.go','/libcalico-go/lib/backend/k8s/scheme/*.go','/libcalico-go/lib/backend/model/*.go','/libcalico-go/lib/clientv3/*.go','/libcalico-go/lib/errors/*.go','/libcalico-go/lib/hash/*.go','/libcalico-go/lib/ipam/*.go','/libcalico-go/lib/json/*.go','/libcalico-go/lib/logutils/*.go','/libcalico-go/lib/names/*.go','/libcalico-go/lib/namespace/*.go','/libcalico-go/lib/net/*.go','/libcalico-go/lib/netlinkutils/*.go','/libcalico-go/lib/options/*.go','/libcalico-go/lib/resources/*.go','/libcalico-go/lib/selector/*.go','/libcalico-go/lib/selector/parser/*.go','/libcalico-go/lib/selector/tokenizer/*.go','/libcalico-go/lib/set/*.go','/libcalico-go/lib/validator/v3/*.go','/libcalico-go/lib/watch/*.go','/libcalico-go/lib/winutils/*.go','/metadata.mk','/node/pkg/cni/*.go','/pkg/buildinfo/*.go'], {pipeline_file: 'ignore', exclude: ['/**/*.md','/**/.gitignore','/**/AUTHORS*','/**/CONTRIBUTING*','/**/DEVELOPER_GUIDE*','/**/LICENSE*','/**/README*','/**/SECURITY.md','/api/**/*_test.go','/crypto/**/*_test.go','/lib/**/*_test.go','/libcalico-go/**/*_test.go','/node/**/*_test.go','/pkg/**/*_test.go']})" + when: "change_in(['/api/pkg/apis/projectcalico/v3/*.go','/api/pkg/lib/numorstring/*.go','/cni-plugin/**','/crypto/pkg/tls/*.go','/hack/test/certs/','/lib.Makefile','/lib/std/time/*.go','/lib/std/uniquelabels/*.go','/lib/std/uniquestr/*.go','/libcalico-go/lib/apiconfig/*.go','/libcalico-go/lib/apis/v3/*.go','/libcalico-go/lib/backend/*.go','/libcalico-go/lib/backend/api/*.go','/libcalico-go/lib/backend/encap/*.go','/libcalico-go/lib/backend/etcdv3/*.go','/libcalico-go/lib/backend/k8s/*.go','/libcalico-go/lib/backend/k8s/conversion/*.go','/libcalico-go/lib/backend/k8s/resources/*.go','/libcalico-go/lib/backend/k8s/scheme/*.go','/libcalico-go/lib/backend/model/*.go','/libcalico-go/lib/clientv3/*.go','/libcalico-go/lib/errors/*.go','/libcalico-go/lib/hash/*.go','/libcalico-go/lib/ipam/*.go','/libcalico-go/lib/json/*.go','/libcalico-go/lib/logutils/*.go','/libcalico-go/lib/names/*.go','/libcalico-go/lib/namespace/*.go','/libcalico-go/lib/net/*.go','/libcalico-go/lib/netlinkutils/*.go','/libcalico-go/lib/options/*.go','/libcalico-go/lib/resources/*.go','/libcalico-go/lib/selector/*.go','/libcalico-go/lib/selector/parser/*.go','/libcalico-go/lib/selector/tokenizer/*.go','/libcalico-go/lib/set/*.go','/libcalico-go/lib/validator/v3/*.go','/libcalico-go/lib/watch/*.go','/libcalico-go/lib/winutils/*.go','/metadata.mk','/node/pkg/cni/*.go','/pkg/buildinfo/*.go'], {pipeline_file: 'ignore', exclude: ['/**/*.md','/**/.gitignore','/**/AUTHORS*','/**/CONTRIBUTING*','/**/DEVELOPER_GUIDE*','/**/LICENSE*','/**/README*','/**/SECURITY.md','/api/**/*_test.go','/crypto/**/*_test.go','/lib/**/*_test.go','/libcalico-go/**/*_test.go','/node/**/*_test.go','/pkg/**/*_test.go']})" dependencies: - Prerequisites task: @@ -219,7 +219,7 @@ blocks: - ../.semaphore/run-and-monitor ci.log make image-windows - name: "cni-plugin: Windows" run: - when: "false or change_in(['/api/pkg/apis/projectcalico/v3/*.go','/api/pkg/lib/numorstring/*.go','/cni-plugin/**','/crypto/pkg/tls/*.go','/hack/test/certs/','/lib.Makefile','/lib/std/uniquelabels/*.go','/lib/std/uniquestr/*.go','/libcalico-go/lib/apiconfig/*.go','/libcalico-go/lib/apis/v3/*.go','/libcalico-go/lib/backend/*.go','/libcalico-go/lib/backend/api/*.go','/libcalico-go/lib/backend/encap/*.go','/libcalico-go/lib/backend/etcdv3/*.go','/libcalico-go/lib/backend/k8s/*.go','/libcalico-go/lib/backend/k8s/conversion/*.go','/libcalico-go/lib/backend/k8s/resources/*.go','/libcalico-go/lib/backend/k8s/scheme/*.go','/libcalico-go/lib/backend/model/*.go','/libcalico-go/lib/clientv3/*.go','/libcalico-go/lib/errors/*.go','/libcalico-go/lib/hash/*.go','/libcalico-go/lib/ipam/*.go','/libcalico-go/lib/json/*.go','/libcalico-go/lib/logutils/*.go','/libcalico-go/lib/names/*.go','/libcalico-go/lib/namespace/*.go','/libcalico-go/lib/net/*.go','/libcalico-go/lib/netlinkutils/*.go','/libcalico-go/lib/options/*.go','/libcalico-go/lib/resources/*.go','/libcalico-go/lib/selector/*.go','/libcalico-go/lib/selector/parser/*.go','/libcalico-go/lib/selector/tokenizer/*.go','/libcalico-go/lib/set/*.go','/libcalico-go/lib/validator/v3/*.go','/libcalico-go/lib/watch/*.go','/libcalico-go/lib/winutils/*.go','/metadata.mk','/node/pkg/cni/*.go','/pkg/buildinfo/*.go','/process','process/**/*Dockerfile*','process/Makefile','process/deps.txt'], {pipeline_file: 'ignore', exclude: ['/**/*.md','/**/.gitignore','/**/AUTHORS*','/**/CONTRIBUTING*','/**/DEVELOPER_GUIDE*','/**/LICENSE*','/**/README*','/**/SECURITY.md','/api/**/*_test.go','/crypto/**/*_test.go','/lib/**/*_test.go','/libcalico-go/**/*_test.go','/node/**/*_test.go','/pkg/**/*_test.go']})" + when: "false or change_in(['/api/pkg/apis/projectcalico/v3/*.go','/api/pkg/lib/numorstring/*.go','/cni-plugin/**','/crypto/pkg/tls/*.go','/hack/test/certs/','/lib.Makefile','/lib/std/time/*.go','/lib/std/uniquelabels/*.go','/lib/std/uniquestr/*.go','/libcalico-go/lib/apiconfig/*.go','/libcalico-go/lib/apis/v3/*.go','/libcalico-go/lib/backend/*.go','/libcalico-go/lib/backend/api/*.go','/libcalico-go/lib/backend/encap/*.go','/libcalico-go/lib/backend/etcdv3/*.go','/libcalico-go/lib/backend/k8s/*.go','/libcalico-go/lib/backend/k8s/conversion/*.go','/libcalico-go/lib/backend/k8s/resources/*.go','/libcalico-go/lib/backend/k8s/scheme/*.go','/libcalico-go/lib/backend/model/*.go','/libcalico-go/lib/clientv3/*.go','/libcalico-go/lib/errors/*.go','/libcalico-go/lib/hash/*.go','/libcalico-go/lib/ipam/*.go','/libcalico-go/lib/json/*.go','/libcalico-go/lib/logutils/*.go','/libcalico-go/lib/names/*.go','/libcalico-go/lib/namespace/*.go','/libcalico-go/lib/net/*.go','/libcalico-go/lib/netlinkutils/*.go','/libcalico-go/lib/options/*.go','/libcalico-go/lib/resources/*.go','/libcalico-go/lib/selector/*.go','/libcalico-go/lib/selector/parser/*.go','/libcalico-go/lib/selector/tokenizer/*.go','/libcalico-go/lib/set/*.go','/libcalico-go/lib/validator/v3/*.go','/libcalico-go/lib/watch/*.go','/libcalico-go/lib/winutils/*.go','/metadata.mk','/node/pkg/cni/*.go','/pkg/buildinfo/*.go','/process','process/**/*Dockerfile*','process/Makefile','process/deps.txt'], {pipeline_file: 'ignore', exclude: ['/**/*.md','/**/.gitignore','/**/AUTHORS*','/**/CONTRIBUTING*','/**/DEVELOPER_GUIDE*','/**/LICENSE*','/**/README*','/**/SECURITY.md','/api/**/*_test.go','/crypto/**/*_test.go','/lib/**/*_test.go','/libcalico-go/**/*_test.go','/node/**/*_test.go','/pkg/**/*_test.go']})" dependencies: - Prerequisites task: @@ -270,7 +270,7 @@ blocks: - ../.semaphore/run-and-monitor win-fv-containerd.log ./.semaphore/run-win-fv.sh - name: confd run: - when: "change_in(['/api/pkg/apis/projectcalico/v3/*.go','/api/pkg/lib/numorstring/*.go','/confd/**','/crypto/pkg/tls/*.go','/hack/test/certs/','/lib.Makefile','/lib/std/uniquelabels/*.go','/lib/std/uniquestr/*.go','/libcalico-go/lib/apiconfig/*.go','/libcalico-go/lib/apis/v3/*.go','/libcalico-go/lib/backend/*.go','/libcalico-go/lib/backend/api/*.go','/libcalico-go/lib/backend/encap/*.go','/libcalico-go/lib/backend/etcdv3/*.go','/libcalico-go/lib/backend/k8s/*.go','/libcalico-go/lib/backend/k8s/conversion/*.go','/libcalico-go/lib/backend/k8s/resources/*.go','/libcalico-go/lib/backend/k8s/scheme/*.go','/libcalico-go/lib/backend/model/*.go','/libcalico-go/lib/backend/syncersv1/bgpsyncer/*.go','/libcalico-go/lib/backend/syncersv1/dedupebuffer/*.go','/libcalico-go/lib/backend/syncersv1/updateprocessors/*.go','/libcalico-go/lib/backend/watchersyncer/*.go','/libcalico-go/lib/clientv3/*.go','/libcalico-go/lib/epstatusfile/*.go','/libcalico-go/lib/errors/*.go','/libcalico-go/lib/hash/*.go','/libcalico-go/lib/ipam/*.go','/libcalico-go/lib/json/*.go','/libcalico-go/lib/logutils/*.go','/libcalico-go/lib/names/*.go','/libcalico-go/lib/namespace/*.go','/libcalico-go/lib/net/*.go','/libcalico-go/lib/options/*.go','/libcalico-go/lib/readlogger/*.go','/libcalico-go/lib/resources/*.go','/libcalico-go/lib/selector/*.go','/libcalico-go/lib/selector/parser/*.go','/libcalico-go/lib/selector/tokenizer/*.go','/libcalico-go/lib/set/*.go','/libcalico-go/lib/validator/v3/*.go','/libcalico-go/lib/watch/*.go','/libcalico-go/lib/winutils/*.go','/metadata.mk','/pkg/buildinfo/*.go','/typha/pkg/discovery/*.go','/typha/pkg/syncclient/*.go','/typha/pkg/syncclientutils/*.go','/typha/pkg/syncproto/*.go','/typha/pkg/tlsutils/*.go'], {pipeline_file: 'ignore', exclude: ['/**/*.md','/**/.gitignore','/**/AUTHORS*','/**/CONTRIBUTING*','/**/DEVELOPER_GUIDE*','/**/LICENSE*','/**/README*','/**/SECURITY.md','/api/**/*_test.go','/crypto/**/*_test.go','/lib/**/*_test.go','/libcalico-go/**/*_test.go','/pkg/**/*_test.go','/typha/**/*_test.go']})" + when: "change_in(['/api/pkg/apis/projectcalico/v3/*.go','/api/pkg/lib/numorstring/*.go','/confd/**','/crypto/pkg/tls/*.go','/hack/test/certs/','/lib.Makefile','/lib/std/time/*.go','/lib/std/uniquelabels/*.go','/lib/std/uniquestr/*.go','/libcalico-go/lib/apiconfig/*.go','/libcalico-go/lib/apis/v3/*.go','/libcalico-go/lib/backend/*.go','/libcalico-go/lib/backend/api/*.go','/libcalico-go/lib/backend/encap/*.go','/libcalico-go/lib/backend/etcdv3/*.go','/libcalico-go/lib/backend/k8s/*.go','/libcalico-go/lib/backend/k8s/conversion/*.go','/libcalico-go/lib/backend/k8s/resources/*.go','/libcalico-go/lib/backend/k8s/scheme/*.go','/libcalico-go/lib/backend/model/*.go','/libcalico-go/lib/backend/syncersv1/bgpsyncer/*.go','/libcalico-go/lib/backend/syncersv1/dedupebuffer/*.go','/libcalico-go/lib/backend/syncersv1/updateprocessors/*.go','/libcalico-go/lib/backend/watchersyncer/*.go','/libcalico-go/lib/clientv3/*.go','/libcalico-go/lib/epstatusfile/*.go','/libcalico-go/lib/errors/*.go','/libcalico-go/lib/hash/*.go','/libcalico-go/lib/ipam/*.go','/libcalico-go/lib/json/*.go','/libcalico-go/lib/logutils/*.go','/libcalico-go/lib/names/*.go','/libcalico-go/lib/namespace/*.go','/libcalico-go/lib/net/*.go','/libcalico-go/lib/options/*.go','/libcalico-go/lib/readlogger/*.go','/libcalico-go/lib/resources/*.go','/libcalico-go/lib/selector/*.go','/libcalico-go/lib/selector/parser/*.go','/libcalico-go/lib/selector/tokenizer/*.go','/libcalico-go/lib/set/*.go','/libcalico-go/lib/validator/v3/*.go','/libcalico-go/lib/watch/*.go','/libcalico-go/lib/winutils/*.go','/metadata.mk','/pkg/buildinfo/*.go','/typha/pkg/discovery/*.go','/typha/pkg/syncclient/*.go','/typha/pkg/syncclientutils/*.go','/typha/pkg/syncproto/*.go','/typha/pkg/tlsutils/*.go'], {pipeline_file: 'ignore', exclude: ['/**/*.md','/**/.gitignore','/**/AUTHORS*','/**/CONTRIBUTING*','/**/DEVELOPER_GUIDE*','/**/LICENSE*','/**/README*','/**/SECURITY.md','/api/**/*_test.go','/crypto/**/*_test.go','/lib/**/*_test.go','/libcalico-go/**/*_test.go','/pkg/**/*_test.go','/typha/**/*_test.go']})" dependencies: - Prerequisites task: @@ -761,7 +761,7 @@ blocks: - ../.semaphore/run-and-monitor image-$ARCH.log make build ARCH=$ARCH - name: kube-controllers run: - when: "change_in(['/api/pkg/apis/projectcalico/v3/*.go','/api/pkg/lib/numorstring/*.go','/crypto/pkg/tls/*.go','/felix/bpf/tc/defs/*.go','/felix/calc/*.go','/felix/config/*.go','/felix/dataplane/ipsets/*.go','/felix/dataplane/linux/dataplanedefs/*.go','/felix/deltatracker/*.go','/felix/dispatcher/*.go','/felix/environment/*.go','/felix/fv/connectivity/*.go','/felix/fv/containers/*.go','/felix/fv/tcpdump/*.go','/felix/fv/utils/*.go','/felix/generictables/*.go','/felix/hashutils/*.go','/felix/idalloc/*.go','/felix/ip/*.go','/felix/ipsets/*.go','/felix/iptables/*.go','/felix/iptables/cmdshim/*.go','/felix/k8sutils/*.go','/felix/labelindex/*.go','/felix/labelindex/ipsetmember/*.go','/felix/labelindex/labelnamevalueindex/*.go','/felix/labelindex/labelrestrictionindex/*.go','/felix/logutils/*.go','/felix/markbits/*.go','/felix/multidict/*.go','/felix/netlinkshim/*.go','/felix/nftables/*.go','/felix/proto/*.go','/felix/rules/*.go','/felix/serviceindex/*.go','/felix/stringutils/*.go','/felix/types/*.go','/hack/test/certs/','/kube-controllers/**','/lib.Makefile','/lib/std/uniquelabels/*.go','/lib/std/uniquestr/*.go','/libcalico-go/config/*.go','/libcalico-go/lib/apiconfig/*.go','/libcalico-go/lib/apis/v1/*.go','/libcalico-go/lib/apis/v1/unversioned/*.go','/libcalico-go/lib/apis/v3/*.go','/libcalico-go/lib/backend/*.go','/libcalico-go/lib/backend/api/*.go','/libcalico-go/lib/backend/encap/*.go','/libcalico-go/lib/backend/etcdv3/*.go','/libcalico-go/lib/backend/k8s/*.go','/libcalico-go/lib/backend/k8s/conversion/*.go','/libcalico-go/lib/backend/k8s/resources/*.go','/libcalico-go/lib/backend/k8s/scheme/*.go','/libcalico-go/lib/backend/model/*.go','/libcalico-go/lib/backend/watchersyncer/*.go','/libcalico-go/lib/clientv3/*.go','/libcalico-go/lib/debugserver/*.go','/libcalico-go/lib/errors/*.go','/libcalico-go/lib/hash/*.go','/libcalico-go/lib/health/*.go','/libcalico-go/lib/ipam/*.go','/libcalico-go/lib/json/*.go','/libcalico-go/lib/logutils/*.go','/libcalico-go/lib/names/*.go','/libcalico-go/lib/namespace/*.go','/libcalico-go/lib/net/*.go','/libcalico-go/lib/options/*.go','/libcalico-go/lib/packedmap/*.go','/libcalico-go/lib/prometheus/*.go','/libcalico-go/lib/resources/*.go','/libcalico-go/lib/scope/*.go','/libcalico-go/lib/selector/*.go','/libcalico-go/lib/selector/parser/*.go','/libcalico-go/lib/selector/tokenizer/*.go','/libcalico-go/lib/set/*.go','/libcalico-go/lib/validator/v1/*.go','/libcalico-go/lib/validator/v3/*.go','/libcalico-go/lib/watch/*.go','/libcalico-go/lib/winutils/*.go','/metadata.mk','/node/pkg/lifecycle/utils/*.go','/pkg/buildinfo/*.go','/pkg/cmdwrapper/*.go','/typha/pkg/config/*.go','/typha/pkg/logutils/*.go'], {pipeline_file: 'ignore', exclude: ['/**/*.md','/**/.gitignore','/**/AUTHORS*','/**/CONTRIBUTING*','/**/DEVELOPER_GUIDE*','/**/LICENSE*','/**/README*','/**/SECURITY.md','/api/**/*_test.go','/crypto/**/*_test.go','/felix/**/*_test.go','/lib/**/*_test.go','/libcalico-go/**/*_test.go','/node/**/*_test.go','/pkg/**/*_test.go','/typha/**/*_test.go']})" + when: "change_in(['/api/pkg/apis/projectcalico/v3/*.go','/api/pkg/lib/numorstring/*.go','/crypto/pkg/tls/*.go','/felix/bpf/tc/defs/*.go','/felix/calc/*.go','/felix/config/*.go','/felix/dataplane/ipsets/*.go','/felix/dataplane/linux/dataplanedefs/*.go','/felix/deltatracker/*.go','/felix/dispatcher/*.go','/felix/environment/*.go','/felix/fv/connectivity/*.go','/felix/fv/containers/*.go','/felix/fv/tcpdump/*.go','/felix/fv/utils/*.go','/felix/generictables/*.go','/felix/hashutils/*.go','/felix/idalloc/*.go','/felix/ip/*.go','/felix/ipsets/*.go','/felix/iptables/*.go','/felix/iptables/cmdshim/*.go','/felix/k8sutils/*.go','/felix/labelindex/*.go','/felix/labelindex/ipsetmember/*.go','/felix/labelindex/labelnamevalueindex/*.go','/felix/labelindex/labelrestrictionindex/*.go','/felix/logutils/*.go','/felix/markbits/*.go','/felix/multidict/*.go','/felix/netlinkshim/*.go','/felix/nftables/*.go','/felix/proto/*.go','/felix/rules/*.go','/felix/serviceindex/*.go','/felix/stringutils/*.go','/felix/types/*.go','/hack/test/certs/','/kube-controllers/**','/lib.Makefile','/lib/std/time/*.go','/lib/std/uniquelabels/*.go','/lib/std/uniquestr/*.go','/libcalico-go/config/*.go','/libcalico-go/lib/apiconfig/*.go','/libcalico-go/lib/apis/v1/*.go','/libcalico-go/lib/apis/v1/unversioned/*.go','/libcalico-go/lib/apis/v3/*.go','/libcalico-go/lib/backend/*.go','/libcalico-go/lib/backend/api/*.go','/libcalico-go/lib/backend/encap/*.go','/libcalico-go/lib/backend/etcdv3/*.go','/libcalico-go/lib/backend/k8s/*.go','/libcalico-go/lib/backend/k8s/conversion/*.go','/libcalico-go/lib/backend/k8s/resources/*.go','/libcalico-go/lib/backend/k8s/scheme/*.go','/libcalico-go/lib/backend/model/*.go','/libcalico-go/lib/backend/watchersyncer/*.go','/libcalico-go/lib/clientv3/*.go','/libcalico-go/lib/debugserver/*.go','/libcalico-go/lib/errors/*.go','/libcalico-go/lib/hash/*.go','/libcalico-go/lib/health/*.go','/libcalico-go/lib/ipam/*.go','/libcalico-go/lib/json/*.go','/libcalico-go/lib/logutils/*.go','/libcalico-go/lib/names/*.go','/libcalico-go/lib/namespace/*.go','/libcalico-go/lib/net/*.go','/libcalico-go/lib/options/*.go','/libcalico-go/lib/packedmap/*.go','/libcalico-go/lib/prometheus/*.go','/libcalico-go/lib/resources/*.go','/libcalico-go/lib/scope/*.go','/libcalico-go/lib/selector/*.go','/libcalico-go/lib/selector/parser/*.go','/libcalico-go/lib/selector/tokenizer/*.go','/libcalico-go/lib/set/*.go','/libcalico-go/lib/validator/v1/*.go','/libcalico-go/lib/validator/v3/*.go','/libcalico-go/lib/watch/*.go','/libcalico-go/lib/winutils/*.go','/metadata.mk','/node/pkg/lifecycle/utils/*.go','/pkg/buildinfo/*.go','/pkg/cmdwrapper/*.go','/typha/pkg/config/*.go','/typha/pkg/logutils/*.go'], {pipeline_file: 'ignore', exclude: ['/**/*.md','/**/.gitignore','/**/AUTHORS*','/**/CONTRIBUTING*','/**/DEVELOPER_GUIDE*','/**/LICENSE*','/**/README*','/**/SECURITY.md','/api/**/*_test.go','/crypto/**/*_test.go','/felix/**/*_test.go','/lib/**/*_test.go','/libcalico-go/**/*_test.go','/node/**/*_test.go','/pkg/**/*_test.go','/typha/**/*_test.go']})" dependencies: - Prerequisites task: @@ -789,7 +789,7 @@ blocks: - ../.semaphore/run-and-monitor make-ci.log make ci - name: libcalico-go run: - when: "change_in(['/api/pkg/apis/projectcalico/v3/*.go','/api/pkg/lib/numorstring/*.go','/crypto/pkg/tls/*.go','/hack/test/certs/','/lib.Makefile','/lib/std/uniquelabels/*.go','/lib/std/uniquestr/*.go','/libcalico-go/**','/metadata.mk','/typha/pkg/discovery/*.go','/typha/pkg/syncclient/*.go','/typha/pkg/syncproto/*.go','/typha/pkg/tlsutils/*.go'], {pipeline_file: 'ignore', exclude: ['/**/*.md','/**/.gitignore','/**/AUTHORS*','/**/CONTRIBUTING*','/**/DEVELOPER_GUIDE*','/**/LICENSE*','/**/README*','/**/SECURITY.md','/api/**/*_test.go','/crypto/**/*_test.go','/lib/**/*_test.go','/typha/**/*_test.go']})" + when: "change_in(['/api/pkg/apis/projectcalico/v3/*.go','/api/pkg/lib/numorstring/*.go','/crypto/pkg/tls/*.go','/hack/test/certs/','/lib.Makefile','/lib/std/time/*.go','/lib/std/uniquelabels/*.go','/lib/std/uniquestr/*.go','/libcalico-go/**','/metadata.mk','/typha/pkg/discovery/*.go','/typha/pkg/syncclient/*.go','/typha/pkg/syncproto/*.go','/typha/pkg/tlsutils/*.go'], {pipeline_file: 'ignore', exclude: ['/**/*.md','/**/.gitignore','/**/AUTHORS*','/**/CONTRIBUTING*','/**/DEVELOPER_GUIDE*','/**/LICENSE*','/**/README*','/**/SECURITY.md','/api/**/*_test.go','/crypto/**/*_test.go','/lib/**/*_test.go','/typha/**/*_test.go']})" dependencies: - Prerequisites task: @@ -919,7 +919,7 @@ blocks: - ../.semaphore/run-and-monitor make-ci.log make ci - name: Typha run: - when: "change_in(['/api/pkg/apis/projectcalico/v3/*.go','/api/pkg/lib/numorstring/*.go','/crypto/pkg/tls/*.go','/hack/test/certs/','/lib.Makefile','/lib/std/uniquelabels/*.go','/lib/std/uniquestr/*.go','/libcalico-go/lib/apiconfig/*.go','/libcalico-go/lib/apis/v1/*.go','/libcalico-go/lib/apis/v1/unversioned/*.go','/libcalico-go/lib/apis/v3/*.go','/libcalico-go/lib/backend/*.go','/libcalico-go/lib/backend/api/*.go','/libcalico-go/lib/backend/encap/*.go','/libcalico-go/lib/backend/etcdv3/*.go','/libcalico-go/lib/backend/k8s/*.go','/libcalico-go/lib/backend/k8s/conversion/*.go','/libcalico-go/lib/backend/k8s/resources/*.go','/libcalico-go/lib/backend/k8s/scheme/*.go','/libcalico-go/lib/backend/model/*.go','/libcalico-go/lib/backend/syncersv1/bgpsyncer/*.go','/libcalico-go/lib/backend/syncersv1/dedupebuffer/*.go','/libcalico-go/lib/backend/syncersv1/felixsyncer/*.go','/libcalico-go/lib/backend/syncersv1/nodestatussyncer/*.go','/libcalico-go/lib/backend/syncersv1/tunnelipsyncer/*.go','/libcalico-go/lib/backend/syncersv1/updateprocessors/*.go','/libcalico-go/lib/backend/watchersyncer/*.go','/libcalico-go/lib/clientv3/*.go','/libcalico-go/lib/debugserver/*.go','/libcalico-go/lib/errors/*.go','/libcalico-go/lib/hash/*.go','/libcalico-go/lib/health/*.go','/libcalico-go/lib/ipam/*.go','/libcalico-go/lib/json/*.go','/libcalico-go/lib/logutils/*.go','/libcalico-go/lib/metricsserver/*.go','/libcalico-go/lib/multireadbuf/*.go','/libcalico-go/lib/names/*.go','/libcalico-go/lib/namespace/*.go','/libcalico-go/lib/net/*.go','/libcalico-go/lib/options/*.go','/libcalico-go/lib/prometheus/*.go','/libcalico-go/lib/readlogger/*.go','/libcalico-go/lib/resources/*.go','/libcalico-go/lib/scope/*.go','/libcalico-go/lib/selector/*.go','/libcalico-go/lib/selector/parser/*.go','/libcalico-go/lib/selector/tokenizer/*.go','/libcalico-go/lib/set/*.go','/libcalico-go/lib/upgrade/converters/*.go','/libcalico-go/lib/upgrade/migrator/*.go','/libcalico-go/lib/upgrade/migrator/clients/*.go','/libcalico-go/lib/upgrade/migrator/clients/v1/k8s/*.go','/libcalico-go/lib/upgrade/migrator/clients/v1/k8s/custom/*.go','/libcalico-go/lib/upgrade/migrator/clients/v1/k8s/resources/*.go','/libcalico-go/lib/validator/v1/*.go','/libcalico-go/lib/validator/v3/*.go','/libcalico-go/lib/watch/*.go','/libcalico-go/lib/winutils/*.go','/libcalico-go/lib/writelogger/*.go','/metadata.mk','/pkg/buildinfo/*.go','/typha/**'], {pipeline_file: 'ignore', exclude: ['/**/*.md','/**/.gitignore','/**/AUTHORS*','/**/CONTRIBUTING*','/**/DEVELOPER_GUIDE*','/**/LICENSE*','/**/README*','/**/SECURITY.md','/api/**/*_test.go','/crypto/**/*_test.go','/lib/**/*_test.go','/libcalico-go/**/*_test.go','/pkg/**/*_test.go']})" + when: "change_in(['/api/pkg/apis/projectcalico/v3/*.go','/api/pkg/lib/numorstring/*.go','/crypto/pkg/tls/*.go','/hack/test/certs/','/lib.Makefile','/lib/std/time/*.go','/lib/std/uniquelabels/*.go','/lib/std/uniquestr/*.go','/libcalico-go/lib/apiconfig/*.go','/libcalico-go/lib/apis/v1/*.go','/libcalico-go/lib/apis/v1/unversioned/*.go','/libcalico-go/lib/apis/v3/*.go','/libcalico-go/lib/backend/*.go','/libcalico-go/lib/backend/api/*.go','/libcalico-go/lib/backend/encap/*.go','/libcalico-go/lib/backend/etcdv3/*.go','/libcalico-go/lib/backend/k8s/*.go','/libcalico-go/lib/backend/k8s/conversion/*.go','/libcalico-go/lib/backend/k8s/resources/*.go','/libcalico-go/lib/backend/k8s/scheme/*.go','/libcalico-go/lib/backend/model/*.go','/libcalico-go/lib/backend/syncersv1/bgpsyncer/*.go','/libcalico-go/lib/backend/syncersv1/dedupebuffer/*.go','/libcalico-go/lib/backend/syncersv1/felixsyncer/*.go','/libcalico-go/lib/backend/syncersv1/nodestatussyncer/*.go','/libcalico-go/lib/backend/syncersv1/tunnelipsyncer/*.go','/libcalico-go/lib/backend/syncersv1/updateprocessors/*.go','/libcalico-go/lib/backend/watchersyncer/*.go','/libcalico-go/lib/clientv3/*.go','/libcalico-go/lib/debugserver/*.go','/libcalico-go/lib/errors/*.go','/libcalico-go/lib/hash/*.go','/libcalico-go/lib/health/*.go','/libcalico-go/lib/ipam/*.go','/libcalico-go/lib/json/*.go','/libcalico-go/lib/logutils/*.go','/libcalico-go/lib/metricsserver/*.go','/libcalico-go/lib/multireadbuf/*.go','/libcalico-go/lib/names/*.go','/libcalico-go/lib/namespace/*.go','/libcalico-go/lib/net/*.go','/libcalico-go/lib/options/*.go','/libcalico-go/lib/prometheus/*.go','/libcalico-go/lib/readlogger/*.go','/libcalico-go/lib/resources/*.go','/libcalico-go/lib/scope/*.go','/libcalico-go/lib/selector/*.go','/libcalico-go/lib/selector/parser/*.go','/libcalico-go/lib/selector/tokenizer/*.go','/libcalico-go/lib/set/*.go','/libcalico-go/lib/upgrade/converters/*.go','/libcalico-go/lib/upgrade/migrator/*.go','/libcalico-go/lib/upgrade/migrator/clients/*.go','/libcalico-go/lib/upgrade/migrator/clients/v1/k8s/*.go','/libcalico-go/lib/upgrade/migrator/clients/v1/k8s/custom/*.go','/libcalico-go/lib/upgrade/migrator/clients/v1/k8s/resources/*.go','/libcalico-go/lib/validator/v1/*.go','/libcalico-go/lib/validator/v3/*.go','/libcalico-go/lib/watch/*.go','/libcalico-go/lib/winutils/*.go','/libcalico-go/lib/writelogger/*.go','/metadata.mk','/pkg/buildinfo/*.go','/typha/**'], {pipeline_file: 'ignore', exclude: ['/**/*.md','/**/.gitignore','/**/AUTHORS*','/**/CONTRIBUTING*','/**/DEVELOPER_GUIDE*','/**/LICENSE*','/**/README*','/**/SECURITY.md','/api/**/*_test.go','/crypto/**/*_test.go','/lib/**/*_test.go','/libcalico-go/**/*_test.go','/pkg/**/*_test.go']})" dependencies: - Prerequisites task: @@ -1101,7 +1101,7 @@ blocks: - artifact push job logs - name: Mock node run: - when: "change_in(['/api/pkg/apis/projectcalico/v3/*.go','/api/pkg/lib/numorstring/*.go','/crypto/pkg/tls/*.go','/hack/test/certs/','/lib.Makefile','/lib/std/uniquelabels/*.go','/lib/std/uniquestr/*.go','/libcalico-go/lib/apis/v3/*.go','/libcalico-go/lib/backend/api/*.go','/libcalico-go/lib/backend/encap/*.go','/libcalico-go/lib/backend/model/*.go','/libcalico-go/lib/errors/*.go','/libcalico-go/lib/json/*.go','/libcalico-go/lib/logutils/*.go','/libcalico-go/lib/names/*.go','/libcalico-go/lib/namespace/*.go','/libcalico-go/lib/net/*.go','/libcalico-go/lib/readlogger/*.go','/libcalico-go/lib/winutils/*.go','/metadata.mk','/pkg/buildinfo/*.go','/test-tools/mocknode/**','/typha/pkg/discovery/*.go','/typha/pkg/syncclient/*.go','/typha/pkg/syncproto/*.go','/typha/pkg/tlsutils/*.go'], {pipeline_file: 'ignore', exclude: ['/**/*.md','/**/.gitignore','/**/AUTHORS*','/**/CONTRIBUTING*','/**/DEVELOPER_GUIDE*','/**/LICENSE*','/**/README*','/**/SECURITY.md','/api/**/*_test.go','/crypto/**/*_test.go','/lib/**/*_test.go','/libcalico-go/**/*_test.go','/pkg/**/*_test.go','/typha/**/*_test.go']})" + when: "change_in(['/api/pkg/apis/projectcalico/v3/*.go','/api/pkg/lib/numorstring/*.go','/crypto/pkg/tls/*.go','/hack/test/certs/','/lib.Makefile','/lib/std/time/*.go','/lib/std/uniquelabels/*.go','/lib/std/uniquestr/*.go','/libcalico-go/lib/apis/v3/*.go','/libcalico-go/lib/backend/api/*.go','/libcalico-go/lib/backend/encap/*.go','/libcalico-go/lib/backend/model/*.go','/libcalico-go/lib/errors/*.go','/libcalico-go/lib/json/*.go','/libcalico-go/lib/logutils/*.go','/libcalico-go/lib/names/*.go','/libcalico-go/lib/namespace/*.go','/libcalico-go/lib/net/*.go','/libcalico-go/lib/readlogger/*.go','/libcalico-go/lib/winutils/*.go','/metadata.mk','/pkg/buildinfo/*.go','/test-tools/mocknode/**','/typha/pkg/discovery/*.go','/typha/pkg/syncclient/*.go','/typha/pkg/syncproto/*.go','/typha/pkg/tlsutils/*.go'], {pipeline_file: 'ignore', exclude: ['/**/*.md','/**/.gitignore','/**/AUTHORS*','/**/CONTRIBUTING*','/**/DEVELOPER_GUIDE*','/**/LICENSE*','/**/README*','/**/SECURITY.md','/api/**/*_test.go','/crypto/**/*_test.go','/lib/**/*_test.go','/libcalico-go/**/*_test.go','/pkg/**/*_test.go','/typha/**/*_test.go']})" dependencies: - Prerequisites task: From 67a7d23b1adf7f9bd108001f2c50e2ca81844f1d Mon Sep 17 00:00:00 2001 From: Shaun Crampton Date: Fri, 5 Sep 2025 10:33:26 +0100 Subject: [PATCH 3/3] Fix windows function sig. --- felix/dataplane/driver_windows.go | 1 + 1 file changed, 1 insertion(+) diff --git a/felix/dataplane/driver_windows.go b/felix/dataplane/driver_windows.go index 5f80678948e..80f60010970 100644 --- a/felix/dataplane/driver_windows.go +++ b/felix/dataplane/driver_windows.go @@ -38,6 +38,7 @@ func StartDataplaneDriver(configParams *config.Config, fatalErrorCallback func(error), k8sClientSet *kubernetes.Clientset, _ *calc.LookupsCache, + typhaEnabled bool, ) (DataplaneDriver, *exec.Cmd) { log.Info("Using Windows dataplane driver.")