@@ -4,10 +4,13 @@ import (
4
4
"fmt"
5
5
"net/http"
6
6
"slices"
7
+ "time"
7
8
8
9
"github.com/coder/coder/v2/coderd/database"
10
+ "github.com/coder/coder/v2/coderd/database/db2sdk"
9
11
"github.com/coder/coder/v2/coderd/httpapi"
10
12
"github.com/coder/coder/v2/coderd/httpmw"
13
+ "github.com/coder/coder/v2/coderd/provisionerdserver"
11
14
"github.com/coder/coder/v2/coderd/provisionerkey"
12
15
"github.com/coder/coder/v2/codersdk"
13
16
)
@@ -112,6 +115,50 @@ func (api *API) provisionerKeys(rw http.ResponseWriter, r *http.Request) {
112
115
httpapi .Write (ctx ,rw ,http .StatusOK ,convertProvisionerKeys (pks ))
113
116
}
114
117
118
+ // @Summary List provisioner key
119
+ // @ID list-provisioner-key
120
+ // @Security CoderSessionToken
121
+ // @Produce json
122
+ // @Tags Enterprise
123
+ // @Param organization path string true "Organization ID"
124
+ // @Success 200 {object} []codersdk.ProvisionerKey
125
+ // @Router /organizations/{organization}/provisionerkeys/daemons [get]
126
+ func (api * API )provisionerKeyDaemons (rw http.ResponseWriter ,r * http.Request ) {
127
+ ctx := r .Context ()
128
+ organization := httpmw .OrganizationParam (r )
129
+
130
+ pks ,err := api .Database .ListProvisionerKeysByOrganization (ctx ,organization .ID )
131
+ if err != nil {
132
+ httpapi .InternalServerError (rw ,err )
133
+ return
134
+ }
135
+ sdkKeys := convertProvisionerKeys (pks )
136
+
137
+ daemons ,err := api .Database .GetProvisionerDaemonsByOrganization (ctx ,organization .ID )
138
+ if err != nil {
139
+ httpapi .InternalServerError (rw ,err )
140
+ return
141
+ }
142
+ // provisionerdserver.DefaultHeartbeatInterval*3 matches the healthcheck report staleInterval.
143
+ recentDaemons := db2sdk .RecentProvisionerDaemons (time .Now (),provisionerdserver .DefaultHeartbeatInterval * 3 ,daemons )
144
+
145
+ pkDaemons := make ([]codersdk.ProvisionerKeyDaemons ,0 ,len (sdkKeys ))
146
+ for _ ,key := range sdkKeys {
147
+ daemons := []codersdk.ProvisionerDaemon {}
148
+ for _ ,daemon := range recentDaemons {
149
+ if daemon .KeyID == key .ID {
150
+ daemons = append (daemons ,daemon )
151
+ }
152
+ }
153
+ pkDaemons = append (pkDaemons , codersdk.ProvisionerKeyDaemons {
154
+ Key :key ,
155
+ Daemons :daemons ,
156
+ })
157
+ }
158
+
159
+ httpapi .Write (ctx ,rw ,http .StatusOK ,pkDaemons )
160
+ }
161
+
115
162
// @Summary Delete provisioner key
116
163
// @ID delete-provisioner-key
117
164
// @Security CoderSessionToken