Skip to content
This repository has been archived by the owner on Oct 14, 2024. It is now read-only.

Commit

Permalink
refactor(api): refactor scan estimation status api object (#1089)
Browse files Browse the repository at this point in the history
* refactor(api): refactor scan estimation status api object

* refactor(api): rename statuses, change description for them

* refactor(api): change some descriptions

* refactor(api): fix selector for GET request
  • Loading branch information
adamtagscherer authored Jan 12, 2024
1 parent 8f7aff3 commit 52aac54
Show file tree
Hide file tree
Showing 8 changed files with 541 additions and 263 deletions.
121 changes: 84 additions & 37 deletions api/models/models.gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 4 additions & 7 deletions api/models/scanestimation.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,12 @@ package models

import "time"

func (s *ScanEstimation) GetState() (ScanEstimationStateState, bool) {
var state ScanEstimationStateState
var ok bool

if s.State != nil && s.State.State != nil {
state, ok = *s.State.State, true
func (s *ScanEstimation) GetStatus() (ScanEstimationStatus, bool) {
if s.Status == nil {
return ScanEstimationStatus{}, false
}

return state, ok
return *s.Status, true
}

func (s *ScanEstimation) GetID() (string, bool) {
Expand Down
113 changes: 113 additions & 0 deletions api/models/scanestimationstatus.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
package models

import (
"fmt"
"time"
)

var scanEstimationStatusStateTransitions = map[ScanEstimationStatusState][]ScanEstimationStatusState{
ScanEstimationStatusStatePending: {
ScanEstimationStatusStateDiscovered,
ScanEstimationStatusStateAborted,
ScanEstimationStatusStateFailed,
ScanEstimationStatusStateDone,
},
ScanEstimationStatusStateDiscovered: {
ScanEstimationStatusStateInProgress,
ScanEstimationStatusStateAborted,
ScanEstimationStatusStateFailed,
},
ScanEstimationStatusStateInProgress: {
ScanEstimationStatusStateAborted,
ScanEstimationStatusStateFailed,
ScanEstimationStatusStateDone,
},
ScanEstimationStatusStateAborted: {
ScanEstimationStatusStateFailed,
},
}

var scanEstimationStatusReasonMapping = map[ScanEstimationStatusState][]ScanEstimationStatusReason{
ScanEstimationStatusStatePending: {
ScanEstimationStatusReasonCreated,
},
ScanEstimationStatusStateDiscovered: {
ScanEstimationStatusReasonSuccessfulDiscovery,
},
ScanEstimationStatusStateInProgress: {
ScanEstimationStatusReasonRunning,
},
ScanEstimationStatusStateAborted: {
ScanEstimationStatusReasonCancellation,
},
ScanEstimationStatusStateFailed: {
ScanEstimationStatusReasonAborted,
ScanEstimationStatusReasonError,
ScanEstimationStatusReasonTimeout,
},
ScanEstimationStatusStateDone: {
ScanEstimationStatusReasonNothingToEstimate,
ScanEstimationStatusReasonSuccess,
},
}

func NewScanEstimationStatus(s ScanEstimationStatusState, r ScanEstimationStatusReason, m *string) *ScanEstimationStatus {
return &ScanEstimationStatus{
State: s,
Reason: r,
Message: m,
LastTransitionTime: time.Now(),
}
}

func (a *ScanEstimationStatus) Equals(b ScanEstimationStatus) bool {
if a.Message == nil && b.Message != nil {
return false
}
if b.Message == nil && a.Message != nil {
return false
}
if a.Message == nil && b.Message == nil {
return a.State == b.State && a.Reason == b.Reason
}

return a.State == b.State && a.Reason == b.Reason && *a.Message == *b.Message
}

func (a *ScanEstimationStatus) isValidStatusTransition(b ScanEstimationStatus) error {
transitions := scanEstimationStatusStateTransitions[a.State]
for _, transition := range transitions {
if transition == b.State {
return nil
}
}

return fmt.Errorf("invalid transition: from=%s to=%s", a.State, b.State)
}

func (a *ScanEstimationStatus) isValidReason() error {
reasons := scanEstimationStatusReasonMapping[a.State]
for _, reason := range reasons {
if reason == a.Reason {
return nil
}
}

return fmt.Errorf("invalid reason for state: state=%s reason=%s", a.State, a.Reason)
}

func (a *ScanEstimationStatus) IsValidTransition(b ScanEstimationStatus) error {
if a.Equals(b) {
return nil
}

if err := b.isValidReason(); err != nil {
return err
}

if err := a.isValidStatusTransition(b); err != nil {
return err
}

return nil
}
69 changes: 56 additions & 13 deletions api/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3468,8 +3468,8 @@ components:
type: array
items:
type: string
state:
$ref: '#/components/schemas/ScanEstimationState'
status:
$ref: '#/components/schemas/ScanEstimationStatus'
startTime:
type: string
format: date-time
Expand Down Expand Up @@ -3504,11 +3504,25 @@ components:
id:
type: string

ScanEstimationState:
ScanEstimationStatus:
type: object
required:
- state
- reason
- lastTransitionTime
properties:
state:
description: The lifecycle state of this scan estimation.
description: |
Describes the state of scan estimation.
| State | Description |
| ---------- | ---------------------------------------- |
| Pending | Initial state for ScanEstimation |
| Discovered | Assets have been discovered |
| InProgress | Scan estimation is in progress |
| Aborted | ScanEstimation has aborted |
| Failed | ScanEstimation has failed |
| Done | ScanEstimation has finished successfully |
type: string
enum:
- Pending
Expand All @@ -3517,20 +3531,49 @@ components:
- Aborted
- Failed
- Done
stateMessage:
description: Human-readable message indicating details about the last state transition.
type: string
stateReason:
description: Machine-readable, UpperCamelCase text indicating the reason for the condition's last transition.
reason:
description: |
Machine readable reason for state transition.
| State | Reason | Description |
| ---------- | ------------------- | ----------------------------------------------------------------- |
| Pending | Created | Initial state for ScanEstimation |
| Discovered | SuccessfulDiscovery | Assets to estimate successfully discovered |
| InProgress | Running | Scan estimation is currently in progress |
| Aborted | Cancellation | ScanEstimation has been cancelled |
| Failed | Aborted | ScanEstimation has failed due to abort |
| Failed | Error | ScanEstimation has failed due to an error |
| Failed | Timeout | ScanEstimation has failed due to timeout |
| Done | NothingToEstimate | ScanEstimation has finished because there was nothing to estimate |
| Done | Success | ScanEstimation has finished successfully |
type: string
enum:
- Created
- SuccessfulDiscovery
- EstimationsRunning
- Cancellation
- Aborted
- TimedOut
- OneOrMoreAssetFailedToEstimate
- DiscoveryFailed
- Unexpected
- Error
- TimeOut
- NothingToEstimate
- Success
x-enum-varnames:
- ScanEstimationStatusReasonCreated
- ScanEstimationStatusReasonSuccessfulDiscovery
- ScanEstimationStatusReasonRunning
- ScanEstimationStatusReasonCancellation
- ScanEstimationStatusReasonAborted
- ScanEstimationStatusReasonError
- ScanEstimationStatusReasonTimeout
- ScanEstimationStatusReasonNothingToEstimate
- ScanEstimationStatusReasonSuccess
message:
description: Human readable message.
type: string
lastTransitionTime:
description: Last date time when the status has changed.
type: string
format: date-time

Estimation:
type: object
Expand Down
Loading

0 comments on commit 52aac54

Please sign in to comment.