• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

mendersoftware / deployments / 1036074718

13 Oct 2023 02:44PM UTC coverage: 78.132% (-2.8%) from 80.913%
1036074718

Pull #939

gitlab-ci

MuchoLucho
Fix: Make comment more readable for users that may end up troubleshooting
to this point

Changelog: None
Ticket: None

Signed-off-by: Luis Ramirez Vargas <luis.ramirez@northern.tech>
Pull Request #939: Fix: Make comment more readable for users

3 of 3 new or added lines in 1 file covered. (100.0%)

483 existing lines in 6 files now uncovered.

3998 of 5117 relevant lines covered (78.13%)

56.11 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

93.79
/api/http/routing.go
1
// Copyright 2023 Northern.tech AS
2
//
3
//    Licensed under the Apache License, Version 2.0 (the "License");
4
//    you may not use this file except in compliance with the License.
5
//    You may obtain a copy of the License at
6
//
7
//        http://www.apache.org/licenses/LICENSE-2.0
8
//
9
//    Unless required by applicable law or agreed to in writing, software
10
//    distributed under the License is distributed on an "AS IS" BASIS,
11
//    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
//    See the License for the specific language governing permissions and
13
//    limitations under the License.
14

15
package http
16

17
import (
18
        "context"
19
        "net/url"
20
        "strings"
21

22
        "github.com/ant0ine/go-json-rest/rest"
23
        "github.com/mendersoftware/go-lib-micro/log"
24

25
        "github.com/mendersoftware/deployments/app"
26
        "github.com/mendersoftware/deployments/store"
27
        "github.com/mendersoftware/deployments/utils/restutil"
28
        "github.com/mendersoftware/deployments/utils/restutil/view"
29
)
30

31
const (
32
        ApiUrlInternal   = "/api/internal/v1/deployments"
33
        ApiUrlManagement = "/api/management/v1/deployments"
34
        ApiUrlDevices    = "/api/devices/v1/deployments"
35

36
        ApiUrlManagementArtifacts               = ApiUrlManagement + "/artifacts"
37
        ApiUrlManagementArtifactsList           = ApiUrlManagement + "/artifacts/list"
38
        ApiUrlManagementArtifactsGenerate       = ApiUrlManagement + "/artifacts/generate"
39
        ApiUrlManagementArtifactsDirectUpload   = ApiUrlManagement + "/artifacts/directupload"
40
        ApiUrlManagementArtifactsCompleteUpload = ApiUrlManagementArtifactsDirectUpload +
41
                "/#id/complete"
42
        ApiUrlManagementArtifactsId         = ApiUrlManagement + "/artifacts/#id"
43
        ApiUrlManagementArtifactsIdDownload = ApiUrlManagement + "/artifacts/#id/download"
44

45
        ApiUrlManagementDeployments                   = ApiUrlManagement + "/deployments"
46
        ApiUrlManagementMultipleDeploymentsStatistics = ApiUrlManagement +
47
                "/deployments/statistics/list"
48
        ApiUrlManagementDeploymentsGroup       = ApiUrlManagement + "/deployments/group/#name"
49
        ApiUrlManagementDeploymentsId          = ApiUrlManagement + "/deployments/#id"
50
        ApiUrlManagementDeploymentsStatistics  = ApiUrlManagement + "/deployments/#id/statistics"
51
        ApiUrlManagementDeploymentsStatus      = ApiUrlManagement + "/deployments/#id/status"
52
        ApiUrlManagementDeploymentsDevices     = ApiUrlManagement + "/deployments/#id/devices"
53
        ApiUrlManagementDeploymentsDevicesList = ApiUrlManagement + "/deployments/#id/devices/list"
54
        ApiUrlManagementDeploymentsLog         = ApiUrlManagement +
55
                "/deployments/#id/devices/#devid/log"
56
        ApiUrlManagementDeploymentsDeviceId      = ApiUrlManagement + "/deployments/devices/#id"
57
        ApiUrlManagementDeploymentsDeviceHistory = ApiUrlManagement + "/deployments/devices/#id/history"
58
        ApiUrlManagementDeploymentsDeviceList    = ApiUrlManagement + "/deployments/#id/device_list"
59

60
        ApiUrlManagementReleases     = ApiUrlManagement + "/deployments/releases"
61
        ApiUrlManagementReleasesList = ApiUrlManagement + "/deployments/releases/list"
62

63
        ApiUrlManagementLimitsName = ApiUrlManagement + "/limits/#name"
64

65
        ApiUrlManagementV2                      = "/api/management/v2/deployments"
66
        ApiUrlManagementV2Releases              = ApiUrlManagementV2 + "/deployments/releases"
67
        ApiUrlManagementV2ReleasesName          = ApiUrlManagementV2Releases + "/#name"
68
        ApiUrlManagementV2ReleaseTags           = ApiUrlManagementV2Releases + "/#name/tags"
69
        ApiUrlManagementV2ReleaseAllTags        = ApiUrlManagementV2 + "/releases/all/tags"
70
        ApiUrlManagementV2ReleaseAllUpdateTypes = ApiUrlManagementV2 + "/releases/all/types"
71

72
        ApiUrlDevicesDeploymentsNext  = ApiUrlDevices + "/device/deployments/next"
73
        ApiUrlDevicesDeploymentStatus = ApiUrlDevices + "/device/deployments/#id/status"
74
        ApiUrlDevicesDeploymentsLog   = ApiUrlDevices + "/device/deployments/#id/log"
75
        ApiUrlDevicesDownloadConfig   = ApiUrlDevices +
76
                "/download/configuration/#deployment_id/#device_type/#device_id"
77

78
        ApiUrlInternalAlive                    = ApiUrlInternal + "/alive"
79
        ApiUrlInternalHealth                   = ApiUrlInternal + "/health"
80
        ApiUrlInternalTenants                  = ApiUrlInternal + "/tenants"
81
        ApiUrlInternalTenantDeployments        = ApiUrlInternal + "/tenants/#tenant/deployments"
82
        ApiUrlInternalTenantDeploymentsDevices = ApiUrlInternal + "/tenants/#tenant/deployments/devices"
83
        ApiUrlInternalTenantDeploymentsDevice  = ApiUrlInternal +
84
                "/tenants/#tenant/deployments/devices/#id"
85
        ApiUrlInternalTenantArtifacts       = ApiUrlInternal + "/tenants/#tenant/artifacts"
86
        ApiUrlInternalTenantStorageSettings = ApiUrlInternal +
87
                "/tenants/#tenant/storage/settings"
88
        ApiUrlInternalDeviceConfigurationDeployments = ApiUrlInternal +
89
                "/tenants/#tenant/configuration/deployments/#deployment_id/devices/#device_id"
90
        ApiUrlInternalDeviceDeploymentLastStatusDeployments = ApiUrlInternal +
91
                "/tenants/#tenant/devices/deployments/last"
92
)
93

94
// NewRouter defines all REST API routes.
95
func NewRouter(
96
        ctx context.Context,
97
        app app.App,
98
        ds store.DataStore,
99
        cfg *Config,
100
) (rest.App, error) {
7✔
101

7✔
102
        // Create and configure API handlers
7✔
103
        //
7✔
104
        // Encode base64 secret in either std or URL encoding ignoring padding.
7✔
105
        deploymentsHandlers := NewDeploymentsApiHandlers(
7✔
106
                ds, new(view.RESTView), app, cfg,
7✔
107
        )
7✔
108

7✔
109
        // Routing
7✔
110
        imageRoutes := NewImagesResourceRoutes(deploymentsHandlers, cfg)
7✔
111
        deploymentsRoutes := NewDeploymentsResourceRoutes(deploymentsHandlers)
7✔
112
        limitsRoutes := NewLimitsResourceRoutes(deploymentsHandlers)
7✔
113
        tenantsRoutes := TenantRoutes(deploymentsHandlers)
7✔
114
        releasesRoutes := ReleasesRoutes(deploymentsHandlers)
7✔
115

7✔
116
        routes := append(releasesRoutes, deploymentsRoutes...)
7✔
117
        routes = append(routes, limitsRoutes...)
7✔
118
        routes = append(routes, tenantsRoutes...)
7✔
119
        routes = append(routes, imageRoutes...)
7✔
120

7✔
121
        return rest.MakeRouter(restutil.AutogenOptionsRoutes(restutil.NewOptionsHandler, routes...)...)
7✔
122
}
7✔
123

124
func NewImagesResourceRoutes(controller *DeploymentsApiHandlers, cfg *Config) []*rest.Route {
7✔
125

7✔
126
        if controller == nil {
7✔
UNCOV
127
                return []*rest.Route{}
×
128
        }
×
129

130
        routes := []*rest.Route{
7✔
131
                rest.Post(ApiUrlManagementArtifacts, controller.NewImage),
7✔
132
                rest.Post(ApiUrlManagementArtifactsGenerate, controller.GenerateImage),
7✔
133
                rest.Get(ApiUrlManagementArtifacts, controller.GetImages),
7✔
134
                rest.Get(ApiUrlManagementArtifactsList, controller.ListImages),
7✔
135

7✔
136
                rest.Get(ApiUrlManagementArtifactsId, controller.GetImage),
7✔
137
                rest.Delete(ApiUrlManagementArtifactsId, controller.DeleteImage),
7✔
138
                rest.Put(ApiUrlManagementArtifactsId, controller.EditImage),
7✔
139

7✔
140
                rest.Get(ApiUrlManagementArtifactsIdDownload, controller.DownloadLink),
7✔
141
        }
7✔
142
        if cfg.EnableDirectUpload {
14✔
143
                log.NewEmpty().Infof(
7✔
144
                        "direct upload enabled: POST %s",
7✔
145
                        ApiUrlManagementArtifactsDirectUpload,
7✔
146
                )
7✔
147
                if cfg.EnableDirectUploadSkipVerify {
8✔
148
                        log.NewEmpty().Info(
1✔
149
                                "direct upload enabled SkipVerify",
1✔
150
                        )
1✔
151
                }
1✔
152
                routes = append(routes, rest.Post(
7✔
153
                        ApiUrlManagementArtifactsDirectUpload,
7✔
154
                        controller.UploadLink,
7✔
155
                ))
7✔
156
                routes = append(routes, rest.Post(
7✔
157
                        ApiUrlManagementArtifactsCompleteUpload,
7✔
158
                        controller.CompleteUpload,
7✔
159
                ))
7✔
160
        }
161
        return routes
7✔
162
}
163

164
func NewDeploymentsResourceRoutes(controller *DeploymentsApiHandlers) []*rest.Route {
27✔
165

27✔
166
        if controller == nil {
27✔
UNCOV
167
                return []*rest.Route{}
×
UNCOV
168
        }
×
169

170
        return []*rest.Route{
27✔
171

27✔
172
                // Deployments
27✔
173
                rest.Post(ApiUrlManagementDeployments, controller.PostDeployment),
27✔
174
                rest.Post(ApiUrlManagementDeploymentsGroup, controller.DeployToGroup),
27✔
175
                rest.Get(ApiUrlManagementDeployments, controller.LookupDeployment),
27✔
176
                rest.Get(ApiUrlManagementDeploymentsId, controller.GetDeployment),
27✔
177
                rest.Post(ApiUrlManagementMultipleDeploymentsStatistics,
27✔
178
                        controller.GetDeploymentsStats),
27✔
179
                rest.Get(ApiUrlManagementDeploymentsStatistics, controller.GetDeploymentStats),
27✔
180
                rest.Put(ApiUrlManagementDeploymentsStatus, controller.AbortDeployment),
27✔
181
                rest.Get(ApiUrlManagementDeploymentsDevices,
27✔
182
                        controller.GetDeviceStatusesForDeployment),
27✔
183
                rest.Get(ApiUrlManagementDeploymentsDevicesList,
27✔
184
                        controller.GetDevicesListForDeployment),
27✔
185
                rest.Get(ApiUrlManagementDeploymentsLog,
27✔
186
                        controller.GetDeploymentLogForDevice),
27✔
187
                rest.Delete(ApiUrlManagementDeploymentsDeviceId,
27✔
188
                        controller.AbortDeviceDeployments),
27✔
189
                rest.Delete(ApiUrlManagementDeploymentsDeviceHistory,
27✔
190
                        controller.DeleteDeviceDeploymentsHistory),
27✔
191
                rest.Get(ApiUrlManagementDeploymentsDeviceId,
27✔
192
                        controller.ListDeviceDeployments),
27✔
193
                rest.Get(ApiUrlManagementDeploymentsDeviceList,
27✔
194
                        controller.GetDeploymentDeviceList),
27✔
195

27✔
196
                // Configuration deployments (internal)
27✔
197
                rest.Post(ApiUrlInternalDeviceConfigurationDeployments,
27✔
198
                        controller.PostDeviceConfigurationDeployment),
27✔
199

27✔
200
                // Last device deployment status deployments (internal)
27✔
201
                rest.Post(ApiUrlInternalDeviceDeploymentLastStatusDeployments,
27✔
202
                        controller.GetDeviceDeploymentLastStatus),
27✔
203

27✔
204
                // Devices
27✔
205
                rest.Get(ApiUrlDevicesDeploymentsNext, controller.GetDeploymentForDevice),
27✔
206
                rest.Post(ApiUrlDevicesDeploymentsNext, controller.GetDeploymentForDevice),
27✔
207
                rest.Put(ApiUrlDevicesDeploymentStatus,
27✔
208
                        controller.PutDeploymentStatusForDevice),
27✔
209
                rest.Put(ApiUrlDevicesDeploymentsLog,
27✔
210
                        controller.PutDeploymentLogForDevice),
27✔
211
                rest.Get(ApiUrlDevicesDownloadConfig,
27✔
212
                        controller.DownloadConfiguration),
27✔
213

27✔
214
                // Health Check
27✔
215
                rest.Get(ApiUrlInternalAlive, controller.AliveHandler),
27✔
216
                rest.Get(ApiUrlInternalHealth, controller.HealthHandler),
27✔
217
        }
27✔
218
}
219

220
func NewLimitsResourceRoutes(controller *DeploymentsApiHandlers) []*rest.Route {
7✔
221

7✔
222
        if controller == nil {
7✔
UNCOV
223
                return []*rest.Route{}
×
UNCOV
224
        }
×
225

226
        return []*rest.Route{
7✔
227
                // limits
7✔
228
                rest.Get(ApiUrlManagementLimitsName, controller.GetLimit),
7✔
229
        }
7✔
230
}
231

232
func TenantRoutes(controller *DeploymentsApiHandlers) []*rest.Route {
7✔
233
        if controller == nil {
7✔
UNCOV
234
                return []*rest.Route{}
×
UNCOV
235
        }
×
236

237
        return []*rest.Route{
7✔
238
                rest.Post(ApiUrlInternalTenants, controller.ProvisionTenantsHandler),
7✔
239
                rest.Get(ApiUrlInternalTenantDeployments, controller.DeploymentsPerTenantHandler),
7✔
240
                rest.Get(ApiUrlInternalTenantDeploymentsDevices,
7✔
241
                        controller.ListDeviceDeploymentsByIDsInternal),
7✔
242
                rest.Get(ApiUrlInternalTenantDeploymentsDevice,
7✔
243
                        controller.ListDeviceDeploymentsInternal),
7✔
244
                rest.Delete(ApiUrlInternalTenantDeploymentsDevice,
7✔
245
                        controller.AbortDeviceDeploymentsInternal),
7✔
246
                rest.Post(ApiUrlInternalTenantArtifacts, controller.NewImageForTenantHandler),
7✔
247

7✔
248
                // per-tenant storage settings
7✔
249
                rest.Get(ApiUrlInternalTenantStorageSettings, controller.GetTenantStorageSettingsHandler),
7✔
250
                rest.Put(ApiUrlInternalTenantStorageSettings, controller.PutTenantStorageSettingsHandler),
7✔
251
        }
7✔
252
}
253

254
func ReleasesRoutes(controller *DeploymentsApiHandlers) []*rest.Route {
23✔
255
        if controller == nil {
23✔
UNCOV
256
                return []*rest.Route{}
×
UNCOV
257
        }
×
258

259
        return []*rest.Route{
23✔
260
                rest.Get(ApiUrlManagementReleases, controller.GetReleases),
23✔
261
                rest.Get(ApiUrlManagementReleasesList, controller.ListReleases),
23✔
262
                rest.Get(ApiUrlManagementV2Releases, controller.ListReleasesV2),
23✔
263
                rest.Put(ApiUrlManagementV2ReleaseTags, controller.PutReleaseTags),
23✔
264
                rest.Get(ApiUrlManagementV2ReleaseAllTags, controller.GetReleaseTagKeys),
23✔
265
                rest.Get(ApiUrlManagementV2ReleaseAllUpdateTypes, controller.GetReleasesUpdateTypes),
23✔
266
                rest.Patch(ApiUrlManagementV2ReleasesName, controller.PatchRelease),
23✔
267
        }
23✔
268
}
269

270
func FMTConfigURL(scheme, hostname, deploymentID, deviceType, deviceID string) string {
13✔
271
        repl := strings.NewReplacer(
13✔
272
                "#"+ParamDeploymentID, url.PathEscape(deploymentID),
13✔
273
                "#"+ParamDeviceType, url.PathEscape(deviceType),
13✔
274
                "#"+ParamDeviceID, url.PathEscape(deviceID),
13✔
275
        )
13✔
276
        return scheme + "://" + hostname + repl.Replace(ApiUrlDevicesDownloadConfig)
13✔
277
}
13✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc