This commit is contained in:
2025-04-23 17:51:59 +02:00
parent bd492f8d92
commit 32374f76c1
4 changed files with 94 additions and 0 deletions

View File

@@ -36,6 +36,12 @@ import (
"time"
)
//go:generate mockgen -source=obs_utils.go -destination=mock/obs_utils.go -typed
type ObsStatusFetcherWithState interface {
BuildStatusWithState(project string, oldstate string, packages ...string) (*BuildResultList, error)
}
type ObsClient struct {
baseUrl *url.URL
client *http.Client
@@ -438,6 +444,8 @@ type BuildResult struct {
Arch string `xml:"arch,attr"`
Code string `xml:"code,attr"`
Dirty bool `xml:"dirty,attr"`
ScmSync string `xml:"scmsync"`
ScmInfo string `xml:"scminfo"`
Status []PackageBuildStatus `xml:"status"`
Binaries []BinaryList `xml:"binarylist"`
}
@@ -455,6 +463,7 @@ type BinaryList struct {
type BuildResultList struct {
XMLName xml.Name `xml:"resultlist"`
State string `xml:"state,attr"`
Result []BuildResult `xml:"result"`
}
@@ -682,11 +691,18 @@ func (c *ObsClient) ProjectConfig(project string) (string, error) {
}
func (c *ObsClient) BuildStatus(project string, packages ...string) (*BuildResultList, error) {
return c.BuildStatusWithState(project, "", packages...)
}
func (c *ObsClient) BuildStatusWithState(project string, oldstate string, packages ...string) (*BuildResultList, error) {
u := c.baseUrl.JoinPath("build", project, "_result")
query := u.Query()
query.Add("view", "status")
query.Add("view", "binarylist")
query.Add("multibuild", "1")
if len(oldstate) > 0 {
query.Add("oldstate", oldstate)
}
if len(packages) > 0 {
query.Add("lastbuild", "1")
for _, pkg := range packages {

View File

@@ -3,6 +3,11 @@ OBS Status Service
Reports build status of OBS service as an easily to produce SVG
Requests for individual build results:
/obs:project/package/repo/arch
Requests for project results
/obs:project
Areas of Responsibility
-----------------------

View File

@@ -0,0 +1,39 @@
package main
import (
"log"
"slices"
"sync"
"time"
"src.opensuse.org/autogits/common"
)
var WatchedRepos []string
var mutex sync.Mutex
var StatusUpdateCh chan *common.BuildResultList
func WatchObsProject(obs common.ObsStatusFetcherWithState, ObsProject string) {
old_state := ""
mutex.Lock()
if pos, found := slices.BinarySearch(WatchedRepos, ObsProject); found {
mutex.Unlock()
return
} else {
WatchedRepos = slices.Insert(WatchedRepos, pos, ObsProject)
mutex.Unlock()
}
for {
state, err := obs.BuildStatusWithState(ObsProject, old_state)
if err != nil {
log.Println(" *** Error fetching build for", ObsProject, err)
time.Sleep(time.Minute)
} else {
old_state = state.State
StatusUpdateCh <- state
}
}
}

View File

@@ -0,0 +1,34 @@
package main
import (
"testing"
"go.uber.org/mock/gomock"
"src.opensuse.org/autogits/common"
mock_common "src.opensuse.org/autogits/common/mock"
)
func TestWatchObsProject(t *testing.T) {
tests := []struct {
name string
res common.BuildResultList
}{
{
name: "two requests",
res: common.BuildResultList{
State: "success",
},
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
ctl := gomock.NewController(t)
obs := mock_common.NewMockObsStatusFetcherWithState(ctl)
obs.EXPECT().BuildStatusWithState("test:foo", "").Return(&test.res, nil)
WatchObsProject(obs, "test:foo")
})
}
}