Skip to content

Commit c149837

Browse files
Swopxvzf
authored andcommitted
feat: add gofiber handlers
1 parent 75b9c35 commit c149837

File tree

8 files changed

+208
-76
lines changed

8 files changed

+208
-76
lines changed

Readme.md

+21-21
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ Configuration options:
3535
```mermaid
3636
stateDiagram-v2
3737
[*] --> PENDING: register the LeaseRequest
38-
PENDING --> AQUIRED: LeaseRequest is the winner
38+
PENDING --> ACQUIRED: LeaseRequest is the winner
3939
PENDING --> COMPLETED: LeaseProvider completed with status success
4040
COMPLETED --> [*]
41-
AQUIRED --> SUCCESS: the LeaseRequest is released (success)
42-
AQUIRED --> FAILURE: the leaseRequest is released (failure)
41+
ACQUIRED --> SUCCESS: the LeaseRequest is released (success)
42+
ACQUIRED --> FAILURE: the leaseRequest is released (failure)
4343
SUCCESS --> COMPLETED: Update LeaseRequest state
4444
FAILURE --> [*]: the LeaseRequest is discarded
4545
```
@@ -55,26 +55,26 @@ sequenceDiagram
5555
participant GHA2
5656
participant GHA3
5757
58-
GHA3->>+LeaseProvider: Aquire: priority: 3
58+
GHA3->>+LeaseProvider: Acquire: priority: 3
5959
note right of LeaseProvider: No full state awareness (yet)
6060
LeaseProvider-->>-GHA3: priority: 2, status: PENDING
6161
6262
par
6363
loop until aquired lease is released or aquired
64-
GHA1->>+LeaseProvider: Aquire: priority: 1
64+
GHA1->>+LeaseProvider: Acquire: priority: 1
6565
LeaseProvider-->>-GHA1: priority: 1, status: PENDING
6666
end
6767
6868
loop until aquired lease is released or aquired
69-
GHA2->>+LeaseProvider: Aquire: priority: 2
69+
GHA2->>+LeaseProvider: Acquire: priority: 2
7070
LeaseProvider-->>-GHA2: priority: 2, status: PENDING
7171
end
7272
7373
7474
rect rgb(191, 223, 255)
75-
GHA3->>+LeaseProvider: Aquire: priority:3
75+
GHA3->>+LeaseProvider: Acquire: priority:3
7676
note right of LeaseProvider: Full state awareness
77-
LeaseProvider-->>GHA3: priority: 3, status: AQUIRED
77+
LeaseProvider-->>GHA3: priority: 3, status: ACQUIRED
7878
note left of GHA3: holds lease to access shared resource
7979
8080
GHA3->>LeaseProvider: Release: priority: 3, status: SUCCESS
@@ -83,10 +83,10 @@ sequenceDiagram
8383
end
8484
end
8585
86-
GHA1->>+LeaseProvider: Aquire: priority: 1
86+
GHA1->>+LeaseProvider: Acquire: priority: 1
8787
LeaseProvider-->>-GHA1: priority: 1, status: COMPLETED
8888
89-
GHA2->>+LeaseProvider: Aquire: priority: 2
89+
GHA2->>+LeaseProvider: Acquire: priority: 2
9090
LeaseProvider-->>-GHA2: priority: 2, status: COMPLETED
9191
9292
```
@@ -106,15 +106,15 @@ sequenceDiagram
106106
participant GHA_NEXT
107107
108108
109-
GHA1->>+LeaseProvider: Aquire: priority: 1
109+
GHA1->>+LeaseProvider: Acquire: priority: 1
110110
LeaseProvider-->>-GHA1: priority: 1, status: PENDING
111-
GHA2->>+LeaseProvider: Aquire: priority: 2
111+
GHA2->>+LeaseProvider: Acquire: priority: 2
112112
LeaseProvider-->>-GHA2: priority: 2, status: PENDING
113113
114114
rect rgb(255, 200, 200)
115-
GHA3->>+LeaseProvider: Aquire: priority:3
115+
GHA3->>+LeaseProvider: Acquire: priority:3
116116
note right of LeaseProvider: Full state awareness
117-
LeaseProvider-->>GHA3: priority: 3, status: AQUIRED
117+
LeaseProvider-->>GHA3: priority: 3, status: ACQUIRED
118118
note left of GHA3: holds lease to access shared resource
119119
120120
GHA3->>LeaseProvider: Release: priority: 3, status: FAILURE
@@ -123,13 +123,13 @@ sequenceDiagram
123123
end
124124
125125
note right of GHA1: Assuming not sufficient time has passed for stabilize window
126-
GHA1->>+LeaseProvider: Aquire: priority: 1
126+
GHA1->>+LeaseProvider: Acquire: priority: 1
127127
LeaseProvider-->>-GHA1: priority: 1, status: PENDING
128128
129129
rect rgb(255, 200, 200)
130130
note over GHA_NEXT: New GHA run started by GH merge queue after GHA3 failed
131131
loop until lease successful and all request marked COMPLETED
132-
GHA_NEXT->>+LeaseProvider: Aquire: priority:3
132+
GHA_NEXT->>+LeaseProvider: Acquire: priority:3
133133
note right of LeaseProvider: previous lease failed
134134
LeaseProvider-->>-GHA_NEXT: error, previous lease failed (409 CONFLICT)
135135
end
@@ -138,12 +138,12 @@ sequenceDiagram
138138
139139
par
140140
rect rgb(200, 255,200)
141-
GHA2->>+LeaseProvider: Aquire: priority: 2
141+
GHA2->>+LeaseProvider: Acquire: priority: 2
142142
note right of LeaseProvider: GHA2 has the highest priority of remaining badges
143-
LeaseProvider-->>-GHA2: priority: 2, status: AQUIRED
143+
LeaseProvider-->>-GHA2: priority: 2, status: ACQUIRED
144144
end
145145
loop until lease successful
146-
GHA1->>+LeaseProvider: Aquire: priority: 1
146+
GHA1->>+LeaseProvider: Acquire: priority: 1
147147
LeaseProvider-->>-GHA1: priority: 1, status: PENDING
148148
end
149149
@@ -154,10 +154,10 @@ sequenceDiagram
154154
end
155155
end
156156
157-
GHA1->>+LeaseProvider: Aquire: priority: 1
157+
GHA1->>+LeaseProvider: Acquire: priority: 1
158158
LeaseProvider-->>-GHA1: priority: 1, status: COMPLETED
159159
160-
GHA_NEXT->>+LeaseProvider: Aquire: priority: <>
160+
GHA_NEXT->>+LeaseProvider: Acquire: priority: <>
161161
note left of GHA_NEXT: Priority is recalculated as previous branches were merged
162162
LeaseProvider-->>-GHA_NEXT: priority: <>, status: PENDING
163163
```

cmd/server/main.go

+10-2
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package main
22

33
import (
4+
"github.com/ankorstore/gh-action-mq-lease-service/internal/lease"
5+
"github.com/ankorstore/gh-action-mq-lease-service/internal/server/handlers"
46
"github.com/ankorstore/gh-action-mq-lease-service/internal/version"
57
"github.com/ankorstore/gh-action-mq-lease-service/pkg/util/logger"
68
"github.com/gofiber/fiber/v2"
79
)
810

911
const (
10-
LISTEN = ":8080"
12+
LISTEN = ":9999"
1113
)
1214

1315
func main() {
@@ -16,8 +18,14 @@ func main() {
1618
app := fiber.New()
1719
app.Use(logger.FiberMiddleware(log))
1820

21+
orchestrator := lease.NewLeaseProviderOrchestrator()
22+
23+
app.Post("/:owner/:repo/:baseRef/acquire", handlers.Acquire(orchestrator))
24+
app.Post("/:owner/:repo/:baseRef/release", handlers.Release(orchestrator))
25+
26+
app.Get("/:owner/:repo/:baseRef", handlers.ProviderDetails(orchestrator))
27+
1928
if err := app.Listen(LISTEN); err != nil {
2029
log.Err(err).Msg("Fiber server failed")
2130
}
22-
2331
}

internal/lease/leaseprovider.go

+17-12
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ type LeaseStatus string
1919

2020
const (
2121
STATUS_PENDING = "pending"
22-
STATUS_AQUIRED = "aquired"
22+
STATUS_ACQUIRED = "aquired"
2323
STATUS_FAILURE = "failure"
2424
STATUS_SUCCESS = "success"
2525
STATUS_COMPLETED = "completed"
@@ -38,35 +38,40 @@ func (lr *LeaseRequest) UpdateLastSeenAt() {
3838
}
3939

4040
type LeaseProvider interface {
41-
Aquire(LeaseRequest *LeaseRequest) (*LeaseRequest, error)
41+
Acquire(LeaseRequest *LeaseRequest) (*LeaseRequest, error)
4242
Release(LeaseRequest *LeaseRequest) (*LeaseRequest, error)
43+
GetKnown() map[string]*LeaseRequest
4344
}
4445

4546
// FIXME this should survive with crashes -> migrate to badger
4647
type leaseProviderImpl struct {
4748
mutex sync.Mutex
48-
opts *LeaseProviderOpts
49+
opts LeaseProviderOpts
4950

5051
lastUpdatedAt time.Time
5152

5253
aquired *LeaseRequest
5354
known map[string]*LeaseRequest
5455
}
5556

56-
func NewLeaseProvider(opts *LeaseProviderOpts) LeaseProvider {
57+
func NewLeaseProvider(opts LeaseProviderOpts) LeaseProvider {
5758
return &leaseProviderImpl{
5859
opts: opts,
5960
lastUpdatedAt: time.Now(),
6061
known: make(map[string]*LeaseRequest),
6162
}
6263
}
6364

65+
func (lp *leaseProviderImpl) GetKnown() map[string]*LeaseRequest {
66+
return lp.known
67+
}
68+
6469
// evictTTL performs housekeeping based on TTLs and when events have last been received
6570
func (lp *leaseProviderImpl) evictTTL() {
6671
for k, v := range lp.known {
6772
// Do nothing when status is aquired / success.
6873
status := pointer.StringDeref(v.Status, STATUS_PENDING)
69-
if status == STATUS_AQUIRED || status == STATUS_SUCCESS {
74+
if status == STATUS_ACQUIRED || status == STATUS_SUCCESS {
7075
continue
7176
}
7277
if time.Since(*v.lastSeenAt) > lp.opts.TTL {
@@ -81,7 +86,7 @@ func (lp *leaseProviderImpl) cleanup() {
8186
if lp.aquired == nil {
8287
return
8388
}
84-
if pointer.StringDeref(lp.aquired.Status, STATUS_AQUIRED) != STATUS_COMPLETED {
89+
if pointer.StringDeref(lp.aquired.Status, STATUS_ACQUIRED) != STATUS_COMPLETED {
8590
return
8691
}
8792
if len(lp.known) == 1 {
@@ -120,11 +125,11 @@ func (lp *leaseProviderImpl) insert(leaseRequest *LeaseRequest) (*LeaseRequest,
120125
updated = true
121126
}
122127

123-
// Update the state when it's a whitelisted transition (AQUIRED -> SUCCESS/FAILURE)
128+
// Update the state when it's a whitelisted transition (ACQUIRED -> SUCCESS/FAILURE)
124129
existingStatus := pointer.StringDeref(existing.Status, STATUS_PENDING)
125130
leaseRequestStatus := pointer.StringDeref(leaseRequest.Status, STATUS_PENDING)
126131
statusMismatch := existingStatus != leaseRequestStatus
127-
allowedTransition := (existingStatus == STATUS_AQUIRED && (leaseRequestStatus == STATUS_SUCCESS || leaseRequestStatus == STATUS_FAILURE))
132+
allowedTransition := (existingStatus == STATUS_ACQUIRED && (leaseRequestStatus == STATUS_SUCCESS || leaseRequestStatus == STATUS_FAILURE))
128133
// condition
129134
if statusMismatch && allowedTransition {
130135
existing.Status = &leaseRequestStatus
@@ -148,7 +153,7 @@ func (lp *leaseProviderImpl) insert(leaseRequest *LeaseRequest) (*LeaseRequest,
148153
func (lp *leaseProviderImpl) evaluateRequest(req *LeaseRequest) *LeaseRequest {
149154
// Prereq: we can expect the arg to be already part of the map!
150155

151-
if lp.aquired != nil && !(pointer.StringDeref(lp.aquired.Status, STATUS_AQUIRED) == STATUS_FAILURE) {
156+
if lp.aquired != nil && !(pointer.StringDeref(lp.aquired.Status, STATUS_ACQUIRED) == STATUS_FAILURE) {
152157
// Lock already aquired
153158
return req
154159
}
@@ -171,14 +176,14 @@ func (lp *leaseProviderImpl) evaluateRequest(req *LeaseRequest) *LeaseRequest {
171176

172177
// Got the max priority, now check if we are the winner
173178
if req.Priority == maxPriority {
174-
req.Status = pointer.String(STATUS_AQUIRED)
179+
req.Status = pointer.String(STATUS_ACQUIRED)
175180
lp.aquired = req
176181
}
177182

178183
return req
179184
}
180185

181-
func (lp *leaseProviderImpl) Aquire(leaseRequest *LeaseRequest) (*LeaseRequest, error) {
186+
func (lp *leaseProviderImpl) Acquire(leaseRequest *LeaseRequest) (*LeaseRequest, error) {
182187
// Ensure we don't have any collisions
183188
lp.mutex.Lock()
184189
defer lp.mutex.Unlock()
@@ -219,7 +224,7 @@ func (lp *leaseProviderImpl) Release(leaseRequest *LeaseRequest) (*LeaseRequest,
219224
if err != nil {
220225
return nil, err
221226
}
222-
status := pointer.StringDeref(req.Status, STATUS_AQUIRED)
227+
status := pointer.StringDeref(req.Status, STATUS_ACQUIRED)
223228

224229
if status == STATUS_SUCCESS {
225230
// On success, set status to completed so all remaining ones can be removed

0 commit comments

Comments
 (0)