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

mendersoftware / deployments / 972179954

18 Aug 2023 11:32AM UTC coverage: 79.698% (+0.09%) from 79.613%
972179954

Pull #901

gitlab-ci

merlin-northern
feat: save and get the update types

Changelog: Title
Ticket: MEN-6623
Signed-off-by: Peter Grzybowski <peter@northern.tech>
Pull Request #901: feat: save and get the update types

64 of 70 new or added lines in 2 files covered. (91.43%)

396 existing lines in 4 files now uncovered.

7800 of 9787 relevant lines covered (79.7%)

34.06 hits per line

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

93.71
/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
        ApiUrlManagementV2ReleasesName   = ApiUrlManagementV2 + "/deployments/releases/#name"
67
        ApiUrlManagementV2ReleaseTags    = ApiUrlManagementV2ReleasesName + "/tags"
68
        ApiUrlManagementV2ReleaseAllTags = ApiUrlManagementV2 + "/releases/all/tags"
69

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

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

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

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

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

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

7✔
119
        return rest.MakeRouter(restutil.AutogenOptionsRoutes(restutil.NewOptionsHandler, routes...)...)
7✔
120
}
7✔
121

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

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

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

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

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

162
func NewDeploymentsResourceRoutes(controller *DeploymentsApiHandlers) []*rest.Route {
27✔
163

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

168
        return []*rest.Route{
27✔
169

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

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

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

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

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

218
func NewLimitsResourceRoutes(controller *DeploymentsApiHandlers) []*rest.Route {
7✔
219

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

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

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

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

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

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

257
        return []*rest.Route{
21✔
258
                rest.Get(ApiUrlManagementReleases, controller.GetReleases),
21✔
259
                rest.Get(ApiUrlManagementReleasesList, controller.ListReleases),
21✔
260
                rest.Put(ApiUrlManagementV2ReleaseTags, controller.PutReleaseTags),
21✔
261
                rest.Get(ApiUrlManagementV2ReleaseAllTags, controller.GetReleaseTagKeys),
21✔
262
                rest.Patch(ApiUrlManagementV2ReleasesName, controller.PatchRelease),
21✔
263
        }
21✔
264
}
265

266
func FMTConfigURL(scheme, hostname, deploymentID, deviceType, deviceID string) string {
13✔
267
        repl := strings.NewReplacer(
13✔
268
                "#"+ParamDeploymentID, url.PathEscape(deploymentID),
13✔
269
                "#"+ParamDeviceType, url.PathEscape(deviceType),
13✔
270
                "#"+ParamDeviceID, url.PathEscape(deviceID),
13✔
271
        )
13✔
272
        return scheme + "://" + hostname + repl.Replace(ApiUrlDevicesDownloadConfig)
13✔
273
}
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