Skip to content

Commit

Permalink
feat: build worker
Browse files Browse the repository at this point in the history
  • Loading branch information
plyr4 committed Jun 21, 2024
1 parent 19efae4 commit dcba0f3
Show file tree
Hide file tree
Showing 12 changed files with 684 additions and 223 deletions.
4 changes: 4 additions & 0 deletions src/elm/Api/Endpoint.elm
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ type Endpoint
| PipelineConfig Vela.Org Vela.Repo Vela.Ref
| ExpandPipelineConfig Vela.Org Vela.Repo Vela.Ref
| PipelineTemplates Vela.Org Vela.Repo Vela.Ref
| Worker String
| Workers (Maybe Pagination.Page) (Maybe Pagination.PerPage)
| Settings

Expand Down Expand Up @@ -167,6 +168,9 @@ toUrl api endpoint =
Dashboard dashboard ->
url api [ "dashboards", dashboard ] []

Worker worker ->
url api [ "workers", worker ] []

Workers maybePage maybePerPage ->
url api [ "workers" ] <| Pagination.toQueryParams maybePage maybePerPage

Expand Down
20 changes: 20 additions & 0 deletions src/elm/Api/Operations.elm
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ module Api.Operations exposing
, getSharedSecrets
, getToken
, getUserSourceRepos
, getWorker
, getWorkers
, logout
, redeliverHook
Expand Down Expand Up @@ -291,6 +292,25 @@ getRepoBuilds baseUrl session options =
|> withAuth session


{-| getWorker : retrieves worker.
-}
getWorker :
String
-> Session
->
{ a
| worker : String
}
-> Request Vela.Worker
getWorker baseUrl session options =
get baseUrl
(Api.Endpoint.Worker
options.worker
)
Vela.decodeWorker
|> withAuth session


{-| getWorkers : retrieves workers.
-}
getWorkers :
Expand Down
10 changes: 10 additions & 0 deletions src/elm/Components/Tabs.elm
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,16 @@ viewBuildTabs shared props =
, isAlerting = False
, show = True
}
, { name = "Worker"
, toPath =
Route.Path.Org__Repo__Build__Worker
{ org = props.org
, repo = props.repo
, build = props.build
}
, isAlerting = False
, show = True
}
]
in
view props.tabHistory props.currentPath tabs "jump-bar-build"
Expand Down
295 changes: 295 additions & 0 deletions src/elm/Components/Workers.elm
Original file line number Diff line number Diff line change
@@ -0,0 +1,295 @@
module Components.Workers exposing (view, viewSingle)

import Api.Pagination
import Components.Loading
import Components.Pager
import Components.Table
import Html exposing (Html, a, div, span, text, tr)
import Html.Attributes exposing (class, href)
import Http
import LinkHeader exposing (WebLink)
import RemoteData exposing (WebData)
import Shared
import Utils.Helpers as Util
import Vela


type alias Props msg =
{ workers : WebData (List Vela.Worker)
, pager : List WebLink
, gotoPage : Api.Pagination.Page -> msg
}


{-| view : renders a list of workers.
-}
view : Shared.Model -> Props msg -> Html msg
view shared props =
let
actions =
Just <|
div [ class "buttons" ]
[ Components.Pager.view
{ show = True
, links = props.pager
, labels = Components.Pager.defaultLabels
, msg = props.gotoPage
}
]

( noRowsView, rows ) =
let
viewHttpError e =
span [ Util.testAttribute "workers-error" ]
[ text <|
case e of
Http.BadStatus statusCode ->
case statusCode of
401 ->
"No workers found, most likely due to not having access to the resource"

_ ->
"No workers found, there was an error with the server (" ++ String.fromInt statusCode ++ ")"

_ ->
"No workers found"
]
in
case props.workers of
RemoteData.Success w ->
( text "No workers found"
, workersToRows shared w
)

RemoteData.Failure error ->
( viewHttpError error, [] )

_ ->
( Components.Loading.viewSmallLoader, [] )

cfg =
Components.Table.Config
"Workers"
"workers"
noRowsView
tableHeaders
rows
actions
in
div []
[ Components.Table.view cfg
]



-- TABLE


{-| workersToRows : takes list of workers and produces list of Table rows
-}
workersToRows : Shared.Model -> List Vela.Worker -> Components.Table.Rows Vela.Worker msg
workersToRows shared workers =
List.map (\worker -> Components.Table.Row worker (viewWorkerRow shared)) workers


{-| tableHeaders : returns table headers for workers table
-}
tableHeaders : Components.Table.Columns
tableHeaders =
[ ( Nothing, "address" )
, ( Nothing, "status" )
, ( Nothing, "routes" )
, ( Nothing, "active" )
, ( Nothing, "last status update" )
, ( Nothing, "running builds" )
, ( Nothing, "last build started" )
, ( Nothing, "last build finished" )
, ( Nothing, "last checked in" )
, ( Nothing, "build limit" )
]


{-| viewWorkerRow : takes worker and renders a table row
-}
viewWorkerRow : Shared.Model -> Vela.Worker -> Html msg
viewWorkerRow shared worker =
tr [ Util.testAttribute <| "workers-row", statusToRowClass worker.status ]
[ Components.Table.viewItemCell
{ dataLabel = "address"
, parentClassList = []
, itemClassList = []
, children =
[ text worker.address
]
}
, Components.Table.viewItemCell
{ dataLabel = "status"
, parentClassList = []
, itemClassList = []
, children =
[ text worker.status
]
}
, Components.Table.viewListItemCell
{ dataLabel = "routes"
, parentClassList = [ ( "routes", True ) ]
, itemWrapperClassList = []
, itemClassList = []
, children =
[ text <| String.join ", " worker.routes
]
}
, Components.Table.viewItemCell
{ dataLabel = "active"
, parentClassList = []
, itemClassList = []
, children =
[ text <| Util.boolToYesNo worker.active
]
}
, Components.Table.viewItemCell
{ dataLabel = "last status update"
, parentClassList = []
, itemClassList = []
, children =
[ text <| Util.humanReadableDateTimeWithDefault shared.zone worker.last_status_update
]
}
, Components.Table.viewItemCell
{ dataLabel = "running builds"
, parentClassList = []
, itemClassList = []
, children =
[ viewWorkerBuildsLinks worker
]
}
, Components.Table.viewItemCell
{ dataLabel = "last build started"
, parentClassList = []
, itemClassList = []
, children =
[ text <| Util.humanReadableDateTimeWithDefault shared.zone worker.last_build_started
]
}
, Components.Table.viewItemCell
{ dataLabel = "last build finished"
, parentClassList = []
, itemClassList = []
, children =
[ text <| Util.humanReadableDateTimeWithDefault shared.zone worker.last_build_finished
]
}
, Components.Table.viewItemCell
{ dataLabel = "last checked in"
, parentClassList = []
, itemClassList = []
, children =
[ text <| Util.humanReadableDateTimeWithDefault shared.zone worker.last_checked_in
]
}
, Components.Table.viewItemCell
{ dataLabel = "build limit"
, parentClassList = []
, itemClassList = []
, children =
[ text <| String.fromInt worker.build_limit
]
}
]


{-| viewWorkerBuildsLinks : renders a list of links to worker builds
-}
viewWorkerBuildsLinks : Vela.Worker -> Html msg
viewWorkerBuildsLinks worker =
worker.running_builds
|> List.map
(\build ->
a
[ href build.link ]
[ text
(build.link
|> String.split "/"
|> List.reverse
|> List.head
|> Maybe.withDefault ""
|> String.append "#"
)
]
)
|> List.intersperse (text ", ")
|> div []


{-| statusToRowClass : takes a worker status and returns a class for the row
-}
statusToRowClass : String -> Html.Attribute msg
statusToRowClass status =
case status of
"idle" ->
class "status-idle"

"available" ->
class "status-available"

"busy" ->
class "status-busy"

"error" ->
class "status-error"

_ ->
class "status-success"


type alias PropsSingle =
{ worker : WebData Vela.Worker }


{-| viewSingle : takes worker and renders a single
-}
viewSingle : Shared.Model -> PropsSingle -> Html msg
viewSingle shared props =
let
( noRowsView, rows ) =
let
viewHttpError e =
span [ Util.testAttribute "workers-error" ]
[ text <|
case e of
Http.BadStatus statusCode ->
case statusCode of
401 ->
"No workers found, most likely due to not having access to the resource"

_ ->
"No workers found, there was an error with the server (" ++ String.fromInt statusCode ++ ")"

_ ->
"No workers found"
]
in
case props.worker of
RemoteData.Success w ->
( text "No workers found"
, workersToRows shared [ w ]
)

RemoteData.Failure error ->
( viewHttpError error, [] )

_ ->
( Components.Loading.viewSmallLoader, [] )

cfg =
Components.Table.Config
""
"workers"
noRowsView
tableHeaders
rows
Nothing
in
div []
[ Components.Table.view cfg
]
20 changes: 19 additions & 1 deletion src/elm/Effect.elm
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ module Effect exposing
, sendCmd, sendMsg
, pushRoute, replaceRoute, loadExternalUrl
, map, toCmd
, addAlertError, addAlertSuccess, addDeployment, addFavorites, addOrgSecret, addRepoSchedule, addRepoSecret, addSharedSecret, alertsUpdate, approveBuild, cancelBuild, chownRepo, clearRedirect, deleteOrgSecret, deleteRepoSchedule, deleteRepoSecret, deleteSharedSecret, disableRepo, downloadFile, enableRepo, expandPipelineConfig, finishAuthentication, focusOn, getBuild, getBuildGraph, getBuildServiceLog, getBuildServices, getBuildStepLog, getBuildSteps, getCurrentUser, getCurrentUserShared, getDashboard, getOrgBuilds, getOrgRepos, getOrgSecret, getOrgSecrets, getPipelineConfig, getPipelineTemplates, getRepo, getRepoBuilds, getRepoBuildsShared, getRepoDeployments, getRepoHooks, getRepoHooksShared, getRepoSchedule, getRepoSchedules, getRepoSecret, getRepoSecrets, getSettings, getSharedSecret, getSharedSecrets, getWorkers, handleHttpError, logout, pushPath, redeliverHook, repairRepo, replacePath, replaceRouteRemoveTabHistorySkipDomFocus, restartBuild, setRedirect, setTheme, updateFavicon, updateFavorite, updateOrgSecret, updateRepo, updateRepoSchedule, updateRepoSecret, updateSettings, updateSharedSecret, updateSourceReposShared
, addAlertError, addAlertSuccess, addDeployment, addFavorites, addOrgSecret, addRepoSchedule, addRepoSecret, addSharedSecret, alertsUpdate, approveBuild, cancelBuild, chownRepo, clearRedirect, deleteOrgSecret, deleteRepoSchedule, deleteRepoSecret, deleteSharedSecret, disableRepo, downloadFile, enableRepo, expandPipelineConfig, finishAuthentication, focusOn, getBuild, getBuildGraph, getBuildServiceLog, getBuildServices, getBuildStepLog, getBuildSteps, getCurrentUser, getCurrentUserShared, getDashboard, getOrgBuilds, getOrgRepos, getOrgSecret, getOrgSecrets, getPipelineConfig, getPipelineTemplates, getRepo, getRepoBuilds, getRepoBuildsShared, getRepoDeployments, getRepoHooks, getRepoHooksShared, getRepoSchedule, getRepoSchedules, getRepoSecret, getRepoSecrets, getSettings, getSharedSecret, getSharedSecrets, getWorker, getWorkers, handleHttpError, logout, pushPath, redeliverHook, repairRepo, replacePath, replaceRouteRemoveTabHistorySkipDomFocus, restartBuild, setRedirect, setTheme, updateFavicon, updateFavorite, updateOrgSecret, updateRepo, updateRepoSchedule, updateRepoSecret, updateSettings, updateSharedSecret, updateSourceReposShared
)

{-|
Expand Down Expand Up @@ -471,6 +471,24 @@ getRepoDeployments options =
|> sendCmd


getWorker :
{ baseUrl : String
, session : Auth.Session.Session
, onResponse : Result (Http.Detailed.Error String) ( Http.Metadata, Vela.Worker ) -> msg
, worker : String
}
-> Effect msg
getWorker options =
Api.try
options.onResponse
(Api.Operations.getWorker
options.baseUrl
options.session
options
)
|> sendCmd


getWorkers :
{ baseUrl : String
, session : Auth.Session.Session
Expand Down
Loading

0 comments on commit dcba0f3

Please sign in to comment.