1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2025-02-15 14:04:04 +02:00
Googlom af05acad58
feat(events): Publish events to GCP PubSub by each step ()
* test

* test

* draft

* generator

* some polishing

* go mod tidy

* fix unit

* fix unit

* fix unit

* fix unit

* fix unit

* resolve review comments

* resolve review comments

* add debug message on successful publish

* refactor to use global vault client

* cleanup

* rename

* clenup

* refactor

* remove token revocation

* handle nil vaultClient and add comments

* feat(events): Publish events (generated part) ()

* add generated

* add generated

* refactor vaultClient usage

* fix unit tests

* fix unit tests

* fix
2024-10-11 14:55:39 +05:00

88 lines
2.6 KiB
Go

package cmd
import (
piperConfig "github.com/SAP/jenkins-library/pkg/config"
"github.com/SAP/jenkins-library/pkg/events"
"github.com/SAP/jenkins-library/pkg/gcp"
"github.com/SAP/jenkins-library/pkg/log"
"github.com/SAP/jenkins-library/pkg/orchestrator"
"github.com/SAP/jenkins-library/pkg/telemetry"
"github.com/pkg/errors"
)
type gcpPublishEventUtils interface {
GetConfig() *gcpPublishEventOptions
NewPubsubClient(projectNumber, pool, provider, key, oidcRoleId string) gcp.PubsubClient
}
type gcpPublishEventUtilsBundle struct {
config *gcpPublishEventOptions
piperConfig.VaultClient
}
func (g *gcpPublishEventUtilsBundle) GetConfig() *gcpPublishEventOptions {
return g.config
}
func (g *gcpPublishEventUtilsBundle) NewPubsubClient(projectNumber, pool, provider, key, oidcRoleId string) gcp.PubsubClient {
return gcp.NewGcpPubsubClient(g.VaultClient, projectNumber, pool, provider, key, oidcRoleId)
}
func gcpPublishEvent(config gcpPublishEventOptions, telemetryData *telemetry.CustomData) {
utils := &gcpPublishEventUtilsBundle{
config: &config,
VaultClient: piperConfig.GlobalVaultClient(),
}
if err := runGcpPublishEvent(utils); err != nil {
// do not fail the step
log.Entry().WithError(err).Warnf("step execution failed")
}
}
func runGcpPublishEvent(utils gcpPublishEventUtils) error {
provider, err := orchestrator.GetOrchestratorConfigProvider(nil)
if err != nil {
log.Entry().WithError(err).Warning("Cannot infer config from CI environment")
}
config := utils.GetConfig()
data, err := createNewEvent(config)
if err != nil {
return errors.Wrap(err, "failed to create event data")
}
err = utils.NewPubsubClient(
config.GcpProjectNumber,
config.GcpWorkloadIDentityPool,
config.GcpWorkloadIDentityPoolProvider,
provider.BuildURL(),
GeneralConfig.HookConfig.OIDCConfig.RoleID,
).Publish(config.Topic, data)
if err != nil {
return errors.Wrap(err, "failed to publish event")
}
log.Entry().Infof("Event published successfully! With topic: %s", config.Topic)
return nil
}
func createNewEvent(config *gcpPublishEventOptions) ([]byte, error) {
event, err := events.NewEvent(config.EventType, config.EventSource).CreateWithJSONData(config.EventData)
if err != nil {
return []byte{}, errors.Wrap(err, "failed to create new event")
}
err = event.AddToCloudEventData(config.AdditionalEventData)
if err != nil {
log.Entry().Debugf("couldn't add additionalData to cloud event data: %s", err)
}
eventBytes, err := event.ToBytes()
if err != nil {
return []byte{}, errors.Wrap(err, "casting event to bytes failed")
}
log.Entry().Debugf("CloudEvent created: %s", string(eventBytes))
return eventBytes, nil
}