.
This commit is contained in:
parent
eda764b192
commit
7dfbf4c9f2
@ -7,9 +7,12 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
transport "github.com/go-openapi/runtime/client"
|
transport "github.com/go-openapi/runtime/client"
|
||||||
|
"github.com/go-openapi/strfmt"
|
||||||
apiclient "src.opensuse.org/autogits/common/gitea-generated/client"
|
apiclient "src.opensuse.org/autogits/common/gitea-generated/client"
|
||||||
|
"src.opensuse.org/autogits/common/gitea-generated/client/notification"
|
||||||
"src.opensuse.org/autogits/common/gitea-generated/client/organization"
|
"src.opensuse.org/autogits/common/gitea-generated/client/organization"
|
||||||
"src.opensuse.org/autogits/common/gitea-generated/client/repository"
|
"src.opensuse.org/autogits/common/gitea-generated/client/repository"
|
||||||
"src.opensuse.org/autogits/common/gitea-generated/models"
|
"src.opensuse.org/autogits/common/gitea-generated/models"
|
||||||
@ -25,6 +28,63 @@ func (h *RequestHandler) allocateGiteaTransport() (*transport.Runtime, *apiclien
|
|||||||
return r, apiclient.New(r, nil)
|
return r, apiclient.New(r, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *RequestHandler) GetNotifications(since *time.Time) ([]*models.NotificationThread, error){
|
||||||
|
if h.HasError() {
|
||||||
|
return nil, h.Error
|
||||||
|
}
|
||||||
|
|
||||||
|
bigLimit := int64(100000)
|
||||||
|
transport, client := h.allocateGiteaTransport()
|
||||||
|
|
||||||
|
params := notification.NewNotifyGetListParams().
|
||||||
|
WithDefaults().
|
||||||
|
WithLimit(&bigLimit)
|
||||||
|
|
||||||
|
if since != nil {
|
||||||
|
s := strfmt.DateTime(*since)
|
||||||
|
params.SetSince(&s)
|
||||||
|
}
|
||||||
|
|
||||||
|
list, err := client.Notification.NotifyGetList(params, transport.DefaultAuthentication)
|
||||||
|
if err != nil {
|
||||||
|
h.Error = err
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if !list.IsSuccess() {
|
||||||
|
h.Error = fmt.Errorf("Cannot fetch notifications: %s", list.Error())
|
||||||
|
return nil, h.Error
|
||||||
|
}
|
||||||
|
|
||||||
|
return list.Payload, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *RequestHandler) SetNotificationRead(notificationId int) error {
|
||||||
|
if h.HasError() {
|
||||||
|
return h.Error
|
||||||
|
}
|
||||||
|
|
||||||
|
transport, client := h.allocateGiteaTransport()
|
||||||
|
list, err := client.Notification.NotifyReadThread(
|
||||||
|
notification.NewNotifyReadThreadParams().
|
||||||
|
WithDefaults().
|
||||||
|
WithID(string(id)),
|
||||||
|
transport.DefaultAuthentication,
|
||||||
|
)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
h.Error = err
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if !list.IsSuccess() {
|
||||||
|
h.Error = fmt.Errorf("Cannot update notifications: %d", notificationId)
|
||||||
|
return h.Error
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (h *RequestHandler) CreateRepositoryIfNotExist(org Organization, repoName string) *models.Repository {
|
func (h *RequestHandler) CreateRepositoryIfNotExist(org Organization, repoName string) *models.Repository {
|
||||||
if h.HasError() {
|
if h.HasError() {
|
||||||
return nil
|
return nil
|
||||||
@ -177,7 +237,7 @@ func (h *RequestHandler) GetAssociatedPrjGitPR(pr *PullRequestAction) *models.Pu
|
|||||||
|
|
||||||
transport, client := h.allocateGiteaTransport()
|
transport, client := h.allocateGiteaTransport()
|
||||||
|
|
||||||
var page, maxSize int64;
|
var page, maxSize int64
|
||||||
page = 1
|
page = 1
|
||||||
maxSize = 10000
|
maxSize = 10000
|
||||||
state := "open"
|
state := "open"
|
||||||
@ -204,7 +264,7 @@ func (h *RequestHandler) GetAssociatedPrjGitPR(pr *PullRequestAction) *models.Pu
|
|||||||
prLine := fmt.Sprintf(PrPattern, pr.Repository.Owner.Username, pr.Repository.Name, pr.Number)
|
prLine := fmt.Sprintf(PrPattern, pr.Repository.Owner.Username, pr.Repository.Name, pr.Number)
|
||||||
h.Log("attemping to match line: '%s'", prLine)
|
h.Log("attemping to match line: '%s'", prLine)
|
||||||
|
|
||||||
// payload_processing:
|
// payload_processing:
|
||||||
for _, pr := range prs.Payload {
|
for _, pr := range prs.Payload {
|
||||||
lines := strings.Split(pr.Body, "\n")
|
lines := strings.Split(pr.Body, "\n")
|
||||||
|
|
||||||
|
@ -1,14 +1,5 @@
|
|||||||
all: build
|
all: build
|
||||||
|
|
||||||
api.json:
|
build:
|
||||||
curl -o api.json https://src.opensuse.org/swagger.v1.json
|
|
||||||
|
|
||||||
generated/client/gitea_api_client.go: api.json
|
|
||||||
[ -d generated ] || mkdir generated
|
|
||||||
podman run --rm -v $$(pwd):/api ghcr.io/go-swagger/go-swagger generate client -f /api/api.json -t /api/generated
|
|
||||||
|
|
||||||
api: generated/client/gitea_api_client.go
|
|
||||||
|
|
||||||
build: api
|
|
||||||
go build -tags "libsqlite3 linux"
|
go build -tags "libsqlite3 linux"
|
||||||
|
|
||||||
|
@ -4,7 +4,11 @@ go 1.22.3
|
|||||||
|
|
||||||
replace src.opensuse.org/autogits/common => ../bots-common
|
replace src.opensuse.org/autogits/common => ../bots-common
|
||||||
|
|
||||||
require src.opensuse.org/autogits/common v0.0.0-00010101000000-000000000000
|
require (
|
||||||
|
github.com/mattn/go-sqlite3 v1.14.22
|
||||||
|
github.com/rabbitmq/amqp091-go v1.10.0
|
||||||
|
src.opensuse.org/autogits/common v0.0.0-00010101000000-000000000000
|
||||||
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
|
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
|
||||||
@ -23,11 +27,9 @@ require (
|
|||||||
github.com/google/uuid v1.6.0 // indirect
|
github.com/google/uuid v1.6.0 // indirect
|
||||||
github.com/josharian/intern v1.0.0 // indirect
|
github.com/josharian/intern v1.0.0 // indirect
|
||||||
github.com/mailru/easyjson v0.7.7 // indirect
|
github.com/mailru/easyjson v0.7.7 // indirect
|
||||||
github.com/mattn/go-sqlite3 v1.14.22 // indirect
|
|
||||||
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
||||||
github.com/oklog/ulid v1.3.1 // indirect
|
github.com/oklog/ulid v1.3.1 // indirect
|
||||||
github.com/opentracing/opentracing-go v1.2.0 // indirect
|
github.com/opentracing/opentracing-go v1.2.0 // indirect
|
||||||
github.com/rabbitmq/amqp091-go v1.10.0 // indirect
|
|
||||||
go.mongodb.org/mongo-driver v1.14.0 // indirect
|
go.mongodb.org/mongo-driver v1.14.0 // indirect
|
||||||
go.opentelemetry.io/otel v1.24.0 // indirect
|
go.opentelemetry.io/otel v1.24.0 // indirect
|
||||||
go.opentelemetry.io/otel/metric v1.24.0 // indirect
|
go.opentelemetry.io/otel/metric v1.24.0 // indirect
|
||||||
|
@ -68,6 +68,8 @@ go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucg
|
|||||||
go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=
|
go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=
|
||||||
go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=
|
go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=
|
||||||
go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=
|
go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=
|
||||||
|
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
||||||
|
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
||||||
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
|
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
|
||||||
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||||
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
|
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
|
||||||
|
@ -27,6 +27,24 @@ func allocateRequestHandler() *common.RequestHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func PollWorkNotifications() {
|
||||||
|
h := allocateRequestHandler()
|
||||||
|
data, err := h.GetNotifications(nil)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
h.LogPlainError(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if data != nil {
|
||||||
|
for _, notification := range data {
|
||||||
|
h.Log("[+] id: %d", notification.ID)
|
||||||
|
h.Log(" title: %s", notification.Subject.Title)
|
||||||
|
h.Log(" subj: %#v", notification.Subject)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
var defs common.ListenDefinitions
|
var defs common.ListenDefinitions
|
||||||
|
|
||||||
@ -36,7 +54,9 @@ func main() {
|
|||||||
common.RequireGiteaSecretToken()
|
common.RequireGiteaSecretToken()
|
||||||
common.RequireObsSecretToken()
|
common.RequireObsSecretToken()
|
||||||
|
|
||||||
go startProcessingObsMessages("rabbit.opensuse.org", "opensuse", "opensuse")
|
// go ProcessingObsMessages("rabbit.opensuse.org", "opensuse", "opensuse", "")
|
||||||
|
|
||||||
|
PollWorkNotifications()
|
||||||
|
|
||||||
stuck := make(chan int)
|
stuck := make(chan int)
|
||||||
<-stuck
|
<-stuck
|
||||||
|
@ -53,10 +53,15 @@ func processObsMessage(msg *rabbitmq.Delivery) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildHistoryStore() {
|
func ProcessingObsMessages(host, username, password, queueName string) {
|
||||||
}
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
log.Print("recovering... reconnecting...\n")
|
||||||
|
time.Sleep(5 * time.Second)
|
||||||
|
go ProcessingObsMessages(host, username, password, queueName)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
func startProcessingObsMessages(host, username, password string) {
|
|
||||||
auth := ""
|
auth := ""
|
||||||
if len(username) > 0 && len(password) > 0 {
|
if len(username) > 0 && len(password) > 0 {
|
||||||
auth = username + ":" + password + "@"
|
auth = username + ":" + password + "@"
|
||||||
@ -75,12 +80,29 @@ func startProcessingObsMessages(host, username, password string) {
|
|||||||
err = ch.ExchangeDeclarePassive("pubsub", "topic", true, false, false, false, nil)
|
err = ch.ExchangeDeclarePassive("pubsub", "topic", true, false, false, false, nil)
|
||||||
failOnError(err, "Cannot find pubsub exchange")
|
failOnError(err, "Cannot find pubsub exchange")
|
||||||
|
|
||||||
q, err := ch.QueueDeclarePassive("obs-staging-bot", true, false, true, false, nil)
|
var q rabbitmq.Queue
|
||||||
|
if len(queueName) == 0 {
|
||||||
|
q, err = ch.QueueDeclare("", false, true, true, false, nil)
|
||||||
|
} else {
|
||||||
|
q, err = ch.QueueDeclarePassive(queueName, true, false, true, false, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("queue not found .. trying to create it\n")
|
log.Printf("queue not found .. trying to create it: %v\n", err)
|
||||||
q, err = ch.QueueDeclare("obs-staging-bot", true, false, true, false, nil)
|
if ch.IsClosed() {
|
||||||
|
ch, err = connection.Channel()
|
||||||
|
failOnError(err, "Channel cannot be re-opened")
|
||||||
|
}
|
||||||
|
q, err = ch.QueueDeclare(queueName, true, false, true, false, nil)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("can't create persistent queue ... falling back to temporaty queue: %v\n", err)
|
||||||
|
if ch.IsClosed() {
|
||||||
|
ch, err = connection.Channel()
|
||||||
|
failOnError(err, "Channel cannot be re-opened")
|
||||||
|
}
|
||||||
|
q, err = ch.QueueDeclare("", false, true, true, false, nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
//q, err := ch.QueueDeclare("obs-staging-bot", false, true, false, false, nil)
|
|
||||||
failOnError(err, "Cannot declare queue")
|
failOnError(err, "Cannot declare queue")
|
||||||
log.Printf("queue: %s:%d", q.Name, q.Consumers)
|
log.Printf("queue: %s:%d", q.Name, q.Consumers)
|
||||||
|
|
||||||
@ -91,17 +113,16 @@ func startProcessingObsMessages(host, username, password string) {
|
|||||||
failOnError(err, "Cannot start consumer")
|
failOnError(err, "Cannot start consumer")
|
||||||
log.Printf("queue: %s:%d", q.Name, q.Consumers)
|
log.Printf("queue: %s:%d", q.Name, q.Consumers)
|
||||||
|
|
||||||
// TODO: add recovery for NotifyClose and related
|
|
||||||
for {
|
for {
|
||||||
msg, ok := <-msgs
|
msg, ok := <-msgs
|
||||||
if !ok {
|
if !ok {
|
||||||
log.Printf("channel closed?\n")
|
log.Printf("channel/connection closed?\n")
|
||||||
|
|
||||||
if connection.IsClosed() {
|
if connection.IsClosed() {
|
||||||
// reconnect
|
// reconnect
|
||||||
log.Printf("reconnecting...")
|
log.Printf("reconnecting...")
|
||||||
time.Sleep(5 * time.Second)
|
time.Sleep(5 * time.Second)
|
||||||
go startProcessingObsMessages(host, username, password)
|
go ProcessingObsMessages(host, username, password, queueName)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user