diff --git a/plugins/ptp_operator/metrics/manager.go b/plugins/ptp_operator/metrics/manager.go index 5eb82d1e..9827b749 100644 --- a/plugins/ptp_operator/metrics/manager.go +++ b/plugins/ptp_operator/metrics/manager.go @@ -2,6 +2,7 @@ package metrics import ( "fmt" + "path" "strings" "sync" @@ -177,7 +178,7 @@ func (p *PTPEventManager) PublishClockClassEvent(clockClass float64, source stri return } data := p.GetPTPEventsData(ptp.LOCKED, int64(clockClass), source, eventType) - resourceAddress := fmt.Sprintf(p.resourcePrefix, p.nodeName, string(p.publisherTypes[eventType].Resource)) + resourceAddress := path.Join(p.resourcePrefix, p.nodeName, string(p.publisherTypes[eventType].Resource)) p.publish(*data, resourceAddress, eventType) } @@ -197,7 +198,7 @@ func (p *PTPEventManager) publishGNSSEvent(state int64, offset float64, syncStat ValueType: ceevent.DECIMAL, Value: state, }) - resourceAddress := fmt.Sprintf(p.resourcePrefix, p.nodeName, string(p.publisherTypes[eventType].Resource)) + resourceAddress := path.Join(p.resourcePrefix, p.nodeName, string(p.publisherTypes[eventType].Resource)) p.publish(*data, resourceAddress, eventType) } @@ -217,7 +218,7 @@ func (p *PTPEventManager) publishSyncEEvent(syncState ptp.SyncState, source stri Version: ceevent.APISchemaVersion, Values: []ceevent.DataValue{}, } - resource := fmt.Sprintf(p.resourcePrefix, p.nodeName, fmt.Sprintf("/%s/%s", source, "Ql")) + resource := path.Join(p.resourcePrefix, p.nodeName, source, "Ql") if syncState == "" { // clock quality event data.Values = append(data.Values, ceevent.DataValue{ Resource: resource, @@ -225,7 +226,7 @@ func (p *PTPEventManager) publishSyncEEvent(syncState ptp.SyncState, source stri ValueType: ceevent.DECIMAL, Value: float64(ql), }) - resource = fmt.Sprintf(p.resourcePrefix, p.nodeName, fmt.Sprintf("/%s/%s", source, "extQl")) + resource = path.Join(p.resourcePrefix, p.nodeName, source, "extQl") if !extendedTvlEnabled { // have the default value for clarity data.Values = append(data.Values, ceevent.DataValue{ Resource: resource, @@ -243,13 +244,13 @@ func (p *PTPEventManager) publishSyncEEvent(syncState ptp.SyncState, source stri } } else { data.Values = append(data.Values, ceevent.DataValue{ - Resource: fmt.Sprintf(p.resourcePrefix, p.nodeName, fmt.Sprintf("/%s", source)), + Resource: path.Join(p.resourcePrefix, p.nodeName, source), DataType: ceevent.METRIC, ValueType: ceevent.DECIMAL, Value: syncState, }) } - resourceAddress := fmt.Sprintf(p.resourcePrefix, p.nodeName, string(p.publisherTypes[eventType].Resource)) + resourceAddress := path.Join(p.resourcePrefix, p.nodeName, string(p.publisherTypes[eventType].Resource)) p.publish(*data, resourceAddress, eventType) } @@ -260,7 +261,7 @@ func (p *PTPEventManager) GetPTPEventsData(state ptp.SyncState, ptpOffset int64, return nil } // /cluster/xyz/ptp/CLOCK_REALTIME this is not address the event is published to - eventSource := fmt.Sprintf(p.resourcePrefix, p.nodeName, fmt.Sprintf("/%s", source)) + eventSource := path.Join(p.resourcePrefix, p.nodeName, source) data := ceevent.Data{ Version: ceevent.APISchemaVersion, Values: []ceevent.DataValue{}, @@ -289,7 +290,7 @@ func (p *PTPEventManager) GetPTPCloudEvents(data ceevent.Data, eventType ptp.Eve if pubs, ok := p.publisherTypes[eventType]; ok { cneEvent, cneErr := common.CreateEvent( pubs.PubID, string(eventType), - fmt.Sprintf(p.resourcePrefix, p.nodeName, string(p.publisherTypes[eventType].Resource)), + path.Join(p.resourcePrefix, p.nodeName, string(p.publisherTypes[eventType].Resource)), data) if cneErr != nil { return nil, fmt.Errorf("failed to create ptp event, %s", cneErr) @@ -317,7 +318,7 @@ func (p *PTPEventManager) PublishEvent(state ptp.SyncState, ptpOffset int64, sou // /cluster/xyz/ptp/CLOCK_REALTIME this is not address the event is published to data := p.GetPTPEventsData(state, ptpOffset, source, eventType) - resourceAddress := fmt.Sprintf(p.resourcePrefix, p.nodeName, string(p.publisherTypes[eventType].Resource)) + resourceAddress := path.Join(p.resourcePrefix, p.nodeName, string(p.publisherTypes[eventType].Resource)) p.publish(*data, resourceAddress, eventType) // publish the event again as overall sync state // SyncStateChange is the overall sync state including PtpStateChange and OsClockSyncStateChange @@ -325,7 +326,7 @@ func (p *PTPEventManager) PublishEvent(state ptp.SyncState, ptpOffset int64, sou if state != p.lastOverallSyncState { eventType = ptp.SyncStateChange data = p.GetPTPEventsData(state, ptpOffset, source, eventType) - resourceAddress = fmt.Sprintf(p.resourcePrefix, p.nodeName, string(p.publisherTypes[eventType].Resource)) + resourceAddress = path.Join(p.resourcePrefix, p.nodeName, string(p.publisherTypes[eventType].Resource)) p.publish(*data, resourceAddress, eventType) p.lastOverallSyncState = state } diff --git a/plugins/ptp_operator/ptp_operator_plugin.go b/plugins/ptp_operator/ptp_operator_plugin.go index 418a485e..5b910fbd 100644 --- a/plugins/ptp_operator/ptp_operator_plugin.go +++ b/plugins/ptp_operator/ptp_operator_plugin.go @@ -20,6 +20,7 @@ import ( "fmt" "net" "os" + "path" "strings" "sync" @@ -62,7 +63,7 @@ const ( ) var ( - resourcePrefix = "/cluster/node/%s%s" + resourcePrefix = "/cluster/node" publishers = map[ptp.EventType]*ptpTypes.EventPublisherType{} config *common.SCConfiguration eventManager *ptpMetrics.PTPEventManager @@ -88,7 +89,7 @@ func Start(wg *sync.WaitGroup, configuration *common.SCConfiguration, _ func(e i var err error for _, publisherType := range publishers { var pub pubsub.PubSub - if pub, err = createPublisher(fmt.Sprintf(resourcePrefix, nodeName, string(publisherType.Resource))); err != nil { + if pub, err = createPublisher(path.Join(resourcePrefix, nodeName, string(publisherType.Resource))); err != nil { log.Errorf("failed to create a publisher %v", err) return err } diff --git a/plugins/ptp_operator/ptp_operator_plugin_test.go b/plugins/ptp_operator/ptp_operator_plugin_test.go index 0d4c1c62..c33dfcc0 100644 --- a/plugins/ptp_operator/ptp_operator_plugin_test.go +++ b/plugins/ptp_operator/ptp_operator_plugin_test.go @@ -21,6 +21,7 @@ import ( "fmt" "log" "os" + "path" "sync" "testing" @@ -107,7 +108,7 @@ func Test_StartWithHTTP(t *testing.T) { //CLIENT SUBSCRIPTION: create a subscription to consume events endpointURL := fmt.Sprintf("%s%s", scConfig.BaseURL, "dummy") for _, pTypes := range pubsubTypes { - sub := v1pubsub.NewPubSub(types.ParseURI(endpointURL), fmt.Sprintf(resourcePrefix, "test_node", string(pTypes.Resource)), scConfig.APIVersion) + sub := v1pubsub.NewPubSub(types.ParseURI(endpointURL), path.Join(resourcePrefix, "test_node", string(pTypes.Resource)), scConfig.APIVersion) sub, _ = common.CreateSubscription(scConfig, sub) assert.NotEmpty(t, sub.ID) assert.NotEmpty(t, sub.URILocation)